0

我在现有的数据库/用户框架之上使用 Django,所以很遗憾,我无法使用 django auth 框架。

我已经构建了我的自定义身份验证库,现在我只需要弄清楚如何在模板中使用它。某些链接应该只显示给有权访问它的用户。

在 PHP 中我可以做这样的事情

<?php if auth('RestrictedLinkName') {?> <a href=""></a> <?php } ?>

什么是 Django 方式?我一直在玩自定义标签,但还不能让它工作。我在想类似的事情:

{% if check_permission('Restrictedarea') %} hjkfgdkhfg  {% endif %}
4

2 回答 2

1

如果您需要评估check_permission('Restrictedarea'),请在视图函数中执行,并将评估结果传递到模板中。

djangobook说(在第 4:模板,在哲学和限制部分) -

业务逻辑应该与表示逻辑分开。Django 的开发人员将模板系统视为控制表示和表示相关逻辑的工具——仅此而已。模板系统不应该支持超出这个基本目标的功能。

因此,在 Django 模板中直接调用 Python 代码是不可能的。所有的“编程”基本上都局限于模板标签可以做的范围内。可以编写执行任意操作的自定义模板标签,但开箱即用的 Django 模板标签故意不允许执行任意 Python 代码。

如果需要编写自定义标签,请检查以下链接:

于 2013-05-17T09:15:00.783 回答
0

您可以编写自定义模板标签和过滤器。但这可能会在一定程度上帮助您,此外,您必须编写自定义的 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 userinstance 并让您request.user在视图中使用。)。您还可以设置自定义用户模型实例,以便您可以在模板中使用它(如果您在 request_context 中设置)和视图(如果您在中间件中设置)

阅读文档在这里帮不上什么忙,最好检查 django 代码以了解 django 是如何处理这个问题的。

于 2013-05-17T09:31:39.657 回答