gue*_*tli 6 django django-permissions
根据文档,可以创建和使用自定义权限,如下所示:
class Task(models.Model):
...
class Meta:
permissions = (
("view_task", "Can see available tasks"),
)
Run Code Online (Sandbox Code Playgroud)
使用权限:
user.has_perm('app.view_task')
Run Code Online (Sandbox Code Playgroud)
来源:https://docs.djangoproject.com/en/1.10/topics/auth/customizing/#custom-permissions
如果权限字符串中存在拼写错误.例如:我使用user.has_perm('app.view_tasks'),那么这个错字就不会被注意到了.
如果不使用现有权限,我想获得异常或警告.
为了首先避免打字错误,我想有常量:user.PERM_APP_VIEW_TASKS或类似的东西.
从我的文件中覆盖类has_perm的方法:ModelBackendbackends.py
import logging
from difflib import get_close_matches
from django.conf import settings
from django.contrib.auth.backends import ModelBackend
class ModelBackendHelper(ModelBackend):
def has_perm(self, user_obj, perm, obj=None):
if not user_obj.is_active:
return False
else:
obj_perms = self.get_all_permissions(user_obj, obj)
allowed = perm in obj_perms
if not allowed:
if settings.DEBUG:
similar = get_close_matches(perm, obj_perms)
if similar:
logging.warn("{0} not found, but is similar to: {1}".format(perm, ','.join(similar)))
return allowed
Run Code Online (Sandbox Code Playgroud)
怎么运行的:
相同的逻辑has_perm,但如果找到settings.DEBUGisTrue和相似版本,perm则输出 level 的警告日志消息WARN:
WARNING:root:myapp.view_tasks not found, but is similar to: myapp.view_task
Run Code Online (Sandbox Code Playgroud)
AUTHENTICATION_BACKENDS更改in的值settings.py:
AUTHENTICATION_BACKENDS = ['myapp.backends.ModelBackendHelper']
Run Code Online (Sandbox Code Playgroud)
这可以在生产和开发环境中使用,但就我个人而言,我不会将其包含在生产站点中,我希望当一切都进入生产权限时得到巩固。
权限属于模型,为了保持干燥,我重用了以下定义的权限Meta:
from django.db import models
class Task(models.Model):
name = models.CharField(max_length=30)
description = models.TextField()
class Meta:
permissions = (
("view_task", "Can see available tasks"),
)
def _get_perm(model, perm):
for p in model._meta.permissions:
if p[0] == perm:
return p[0]
err = "Permission '{0}' not found in model {1}".format(perm, model)
raise Exception(err)
def format_perm(perm):
return '{0}.{1}'.format(__package__, perm)
def get_perm(model, type):
return format_perm(_get_perm(model, type))
PERM_APP_VIEW_TASK = get_perm(Task, "view_task")
Run Code Online (Sandbox Code Playgroud)
可以使用get_perm或使用快捷方式访问权限PERM_APP_VIEW_TASK:
models.PERM_APP_VIEW_TASK
# or
get_perm(Task, "view_task")
# or
format_perm(_get_perm(Task, "view_task"))
Run Code Online (Sandbox Code Playgroud)
如果搜索缺少权限,get_perm则会引发Exception:
PERM_APP_VIEW_TASK = get_perm(Task, "add_task")
Run Code Online (Sandbox Code Playgroud)
信息:
Exception: Permission 'add_task' not found in model <class 'myapp.models.Task'>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
334 次 |
| 最近记录: |