我在现有的数据库/用户框架上使用Django,所以不幸的是我无法使用django auth框架。
我已经构建了自定义auth库,现在我只需要弄清楚如何在模板中使用它。某些链接只应出现在有权访问它的用户身上。
在PHP中,我可以像这样做
<?php if auth('RestrictedLinkName') {?> <a href=""></a> <?php } ?>
Django的方式是什么?我一直在玩自定义标签,但还没有能够使用它。我想的是:
{% if check_permission('Restrictedarea') %} hjkfgdkhfg {% endif %}
答案 0 :(得分:1)
如果您需要评估check_permission('Restrictedarea')
,请在视图函数中执行此操作,并将评估结果传递给模板。
djangobook说(在第4章:模板,哲学和局限性部分) -
业务逻辑应与表示逻辑分开。 Django的 开发人员将模板系统视为控制演示的工具 和表达相关的逻辑 - 就是这样。模板系统 不应该支持超出这个基本目标的功能。
因此,不可能直接调用Python代码 Django模板。所有“编程”从根本上限于 模板标签的作用范围。可以编写自定义 模板标签做任意事情,但开箱即用的Django 模板标签故意不允许任意Python代码 执行。
如果需要编写自定义标签,请检查以下链接:
答案 1 :(得分:0)
您可以撰写custom template tags and filters。但这可能会帮助您达到某种程度,进一步说,您必须编写自定义context_processors(如果需要,还可以自定义middlewares。)
但是通过自定义功能进行身份验证和权限检查非常困难,但可能。我有一个完全运行自定义身份验证/授权的系统。
首先,您可以检查django context_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检查器只接受一个额外的参数(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_processor CustomProcessor(request):
接受http.request
对象作为参数,您可以传递方法或函数,以验证身份或授权中所需的任何值(会话ID或用户ID等)。您可以编写一个中间件来为您的请求对象设置自定义值(例如django set user
实例,并允许您在视图中使用request.user
。)。您还可以设置自定义用户模型实例,以便在模板中使用它(如果在request_context中设置)和视图中(如果在中间件中设置它)
阅读文档在这里帮不了多多,更好的是检查django代码以了解django如何处理这个问题。