Django上下文处理器检查用户权限

时间:2011-12-30 13:55:49

标签: django django-templates

我想编写一个上下文处理器,它将查看现有的上下文,如果存在表单,请检查用户是否有权编辑该对象。如果没有,我将覆盖该上下文变量。

如何从上下文处理器中读取现有上下文?

编辑: 使用这种类型的上下文处理器的原因是为了避免在每个视图中使用if语句检查权限。某些用户将具有读/写访问权限,其他用户将具有只读权限,而其他用户将无权访问对象级别。我希望在处理完视图后相应地操作表单。

2 个答案:

答案 0 :(得分:4)

为什么不用user_passes_test装饰器包裹视图?你可以在那里运行你喜欢的任何支票 - 不需要黑客。

答案 1 :(得分:1)

您应该使用django-authorityany authority package。虽然,我不能保证他们不依赖黑客本身,但至少你不会孤军奋战。也就是说,这是解决您问题的有效方法:

  1. Monkey patch django.template.base.RequestContext ,设置request.context = self。

  2. 创建模板上下文处理器,可以使用request.context

  3. 将上下文处理器添加到设置,您就可以了

  4. 以下是一个示例,您只需将其粘贴到settings.py中即可:

    def print_context(request):
        print request.context.get('form', 'No form in this context')
        return {}
    
    from django.template.base import RequestContext
    orig_init = RequestContext.__init__
    def new_init(self, request, **kwargs):                                           
        request.context = self
        orig_init(self, request, **kwargs)                                           
    RequestContext.__init__ = new_init
    
    TEMPLATE_CONTEXT_PROCESSORS = (
        'django.core.context_processors.auth',                                       
        'django.core.context_processors.debug',
        'django.core.context_processors.i18n',                                       
        'django.core.context_processors.media',
        'django.core.context_processors.request',
        'settings.print_context',
    )
    

    请注意,你正在反对Django的设计,我发布这个答案假设你知道你在做什么 - 你非常了解Python和Django。