您可以编写自定义模板标签和过滤器。但这可能会在一定程度上帮助您,此外,您必须编写自定义的 context_processors(如果需要,还可以编写自定义中间件。)
但是通过自定义函数进行身份验证和权限检查是相当困难的,但是是可能的。我有一个完全在自定义身份验证/授权上运行的系统。
首先,您可以检查 djangocontext_processors
以了解它们是如何工作的。然后你可以写你的自定义context_processor
。在设置中添加上下文处理器后,您可以使用这些方法,并根据需要进行身份验证/授权。
我的自定义contect_processor
功能之一是:
from django.utils.functional import lazy
def CustomProcessor(request):
cust_perms = {
'admin_perm_check': lazy(lambda: myCustomPermChecker(request), myCustomPermChecker)(),
'system_admin': aFunctionToReturnBoolValue(),
}
return custom_perms
class myCustomPermChecker(object):
def __init__(self, request):
self.request = request
def __getitem__(self, perm_name):
return True if (perm_name in user_perm_list()) else False
在您的模板中
{%if admin_perm_check.perm_name%}...{%endif%}
{%if system_admin %} this is a bool check{%endif%}
您必须将您的 permchecker 定义为一个具有__getitem__
方法的类,这样您的模板标签admin_perm_check.perm_name
才能工作。这个 perm checker 只接受一个额外的参数 ( perm_name
),如果你想使用 django 风格的两个参数检查,那么你必须这样做:
class myCustomPermChecker(object):
def __init__(self):
pass
def __getitem__(self, module_name):
return SecondPermCheckerStep(module_name)
class SecondPermCheckerStep(object):
def __init__(self, module_name):
self.module_name = module_name
def __getitem__(self, perm_name)
return True if ('%s.%s' % (self.module_name,perm_name) in user_perm_list()) else False
{%if admin_perm_check.module_name.perm_name%}
您可以使用另一个class.__getitem__
在您的模板等中添加一个更多的键来游览标签链。
由于您的 context_processorCustomProcessor(request):
接受http.request
对象作为参数,因此您可以向您的方法或函数传递身份验证或授权所需的任何值(会话 ID 或用户 ID 等)。您可以编写一个中间件来为您的请求对象设置自定义值以供使用(如 django set user
instance 并让您request.user
在视图中使用。)。您还可以设置自定义用户模型实例,以便您可以在模板中使用它(如果您在 request_context 中设置)和视图(如果您在中间件中设置)
阅读文档在这里帮不上什么忙,最好检查 django 代码以了解 django 是如何处理这个问题的。