일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 페이지 최적화
- query 최적화
- pyside6
- django test
- Self ERP
- django drf
- pip 설치
- 중량 관리
- qwindows.dll
- Python
- 장고
- django
- optimization page
- QApplication
- tensorflow
- django role based
- test drive development
- django rank
- pip 오류
- orm 최적화
- pyside6 ui
- uiload
- channels
- django erp
- materialized
- ERP
- 재고 관리
- qpa_plugin
- 파이썬
- 장고로 ERP
- Today
- Total
취미삼아 배우는 프로그래밍
DJANGO 권한 그룹 쉽게 만들기.(Setting Group permissions) 본문
장고를 딱 세팅하고 어드민 페이지를 로그인해서 들어가면
위처럼 인증과 권한에 관해 정리해주는 페이지가 있다.
그룹은 말 그대로 각 데이터베이스및 각종 권한을 미리 저장해둔 프리셋 이라고 볼 수 있다.
실제 권한을 미리 이렇게 지정해줄 수 있다.
하지만 문제는 이를 각각 따로 설정해줘야 한다는 점인데,
보통 으례 개발자 서버환경이 있고, 퍼블리싱하는 서버환경이 따로 존재하고 있는데,
개발자서버에서 각종 권한들을 관리자페이지에서 미리 지정을 해준다 쳐도 퍼블리싱 서버에서 마찬가지 작업을 해야한다.
이를 줄여주는 것이 프로그래밍 적으로 해결하는 방법인데
이에관한 스택오버 플로우 답변을 보여주고자 한다.
답변 주소
https://stackoverflow.com/questions/22250352/programmatically-create-a-django-group-with-permissions
Programmatically create a django group with permissions
In the Admin console, I can add a group and add a bunch of permissions that relate to my models, e.g. api | project | Can add project api | project | Can change project api | project | Can delete
stackoverflow.com
따봉을 가장 많이 받은 것은 첫 번째 대답인데, 그 다음 따봉은 특이하게도 질문이다.
(고놈 참 질문잘했네! 인 느낌)
첫 번째 대답은 어떻게보면 가장 원리적인 접근인 것으로 보인다.
from django.contrib.auth.models import Group, Permission
from django.contrib.contenttypes.models import ContentType
from api.models import Project
new_group, created = Group.objects.get_or_create(name='new_group')
# Code to add permission to group ???
ct = ContentType.objects.get_for_model(Project)
# Now what - Say I want to add 'Can add project' permission to new_group?
permission = Permission.objects.create(codename='can_add_project',
name='Can add project',
content_type=ct)
new_group.permissions.add(permission)
> 그룹 테이블에 새로운 그룹을 만들고 여기에 permissions 테이블에 존재하는 내용을 들구와서 그룹쪽에다가
추가하는것이다.
공홈에 나와있는 방법이기도 하고 가장 정론적인 방법인데, 이것도 어떻게 보면 수작업이다.
위의 답변에서 가장 중요하게 봐야할 점은 세 번째 답변인데,
따봉이 가장 적다.
그 내용인즉
# backend/management/commands/initgroups.py
from django.core.management import BaseCommand
from django.contrib.auth.models import Group, Permission
from backend import models
GROUPS_PERMISSIONS = {
'ConnectionAdmins': {
models.StaticCredentials: ['add', 'change', 'delete', 'view'],
models.NamedCredentials: ['add', 'change', 'delete', 'view'],
models.Folder: ['add', 'change', 'delete', 'view'],
models.AppSettings: ['view'],
},
}
class Command(BaseCommand):
def __init__(self, *args, **kwargs):
super(Command, self).__init__(*args, **kwargs)
help = "Create default groups"
def handle(self, *args, **options):
# Loop groups
for group_name in GROUPS_PERMISSIONS:
# Get or create group
group, created = Group.objects.get_or_create(name=group_name)
# Loop models in group
for model_cls in GROUPS_PERMISSIONS[group_name]:
# Loop permissions in group/model
for perm_index, perm_name in \
enumerate(GROUPS_PERMISSIONS[group_name][model_cls]):
# Generate permission name as Django would generate it
codename = perm_name + "_" + model_cls._meta.model_name
try:
# Find permission object and add to group
perm = Permission.objects.get(codename=codename)
group.permissions.add(perm)
self.stdout.write("Adding "
+ codename
+ " to group "
+ group.__str__())
except Permission.DoesNotExist:
self.stdout.write(codename + " not found")
앱 폴더 내에 management/commands/initgroups.py로 저장을 하고,
__init__.py를 마찬가지로 생성해주는 것이다.
결과부터 말하자면,
사용방법은
python manage.py initgroups 를 통해 위 코드를 실행시켜주는 것이다.
특정 상황에서 원할 시 명령어를 통해 위의 코드를 실행시켜줄 수 있다.
그 결과
ConnectionAdmin이라는 그룹이 생기고
이 그룹에는 StaticCredentials, NamedCredentials등의 모델에 관해
add, change, delete, view에 관한 권한을 명시함으로 써 자동적으로 생성하게 도와준다.
GROUPS_PERMISSIONS = {
'관리자(에스폼)': {
models.OrderModel: ['add', 'change', 'delete', 'view'],
models.SubOrderModel: ['add', 'change', 'delete', 'view'],
},
'관리자(SM)': {
models.OrderModel: ['view'],
models.SubOrderModel: ['view'],
},
}
try:
for location in ABSTRACT_LOCATIONS:
GROUPS_PERMISSIONS.update({
location+'_관리자':{
models.OrderModel:['add', 'change', 'delete', 'view'],
models.SubOrderModel: ['add', 'change', 'delete', 'view'],
}
})
except Exception as e:
print(e)
pass
나의 경우엔 GROUPS_PERMISSIONS를 위처럼 설정해줬고
ABSTRACT_LOCATIONS 내에 저장돼있는 ['1호기', '2호기', '3호기', '4호기', '5호기']
에 따라서 그룹을 자동 생성, 권한 자동 지정을 해주는 방식을 했다.
엄청 깔끔한거 같다.
'파이썬(장고)' 카테고리의 다른 글
Generator를 사용해 다양한 깊이의 json 파싱 방법 (0) | 2020.05.15 |
---|---|
django - materialized css form 사용하기 (0) | 2020.03.30 |
오류해결. django. channels(daphne) (0) | 2020.01.04 |
오류해결 django channels twisted asyncioreactor Error (0) | 2019.12.31 |
Django 3.0 ASGI > 실시간 TodoApp 만들어보기 - 2 (0) | 2019.12.28 |