gpt4 book ai didi

django - 如何避免 django 权限字符串中的拼写错误

转载 作者:行者123 更新时间:2023-12-04 15:40:59 31 4
gpt4 key购买 nike

根据文档,可以像这样创建和使用自定义权限:

class Task(models.Model):
...
class Meta:
permissions = (
("view_task", "Can see available tasks"),
)

使用权限:
user.has_perm('app.view_task')

来源: https://docs.djangoproject.com/en/1.10/topics/auth/customizing/#custom-permissions

如果权限字符串中有拼写错误。例如:我使用 user.has_perm('app.view_tasks') ,那么这个错字就不会被注意到。

目标 1

如果不使用现有权限,我想收到异常或警告。

目标 2

为了首先避免拼写错误,我想要常量: user.PERM_APP_VIEW_TASKS或类似的东西。

最佳答案

目标 1

覆盖 has_perm ModelBackend的方法类(class),来自我的 backends.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

这个怎么运作:

has_perm 相同的逻辑但如果 settings.DEBUGTrue和类似版本的 perm找到然后输出级别 WARN 的警告日志消息:
WARNING:root:myapp.view_tasks not found, but is similar to: myapp.view_task

更改 AUTHENTICATION_BACKENDS 的值在 settings.py :
AUTHENTICATION_BACKENDS = ['myapp.backends.ModelBackendHelper']

这可以在生产和开发环境中使用,但我个人不会将它包含在生产站点中,我希望当一切都进入生产权限时得到整合。

目标 2

权限属于模型,为了保持这种干燥,我重用了 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")

可以通过 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"))

如果搜索缺少权限 get_perm将引发 Exception :
PERM_APP_VIEW_TASK = get_perm(Task, "add_task")

信息:
Exception: Permission 'add_task' not found in model <class 'myapp.models.Task'>

关于django - 如何避免 django 权限字符串中的拼写错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39954478/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com