【问题标题】:Django context processor to check user permissionsDjango上下文处理器检查用户权限
【发布时间】:2011-12-30 13:55:48
【问题描述】:

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

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

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

【问题讨论】:

  • 请定义有权编辑该对象
  • 权限将由对象级权限包处理。很可能是 django-rulez。

标签: django django-templates


【解决方案1】:

为什么不用user_passes_test 装饰器包裹视图呢?你可以在那里运行任何你喜欢的检查——不需要黑客攻击。

【讨论】:

  • user_passes_test 不会完全符合我的要求,因为某些用户可能具有只读访问权限。也许我可以编写一个装饰器,在某些情况下可以使表单只读。我需要阅读装饰器。
  • 请阅读装饰器。与猴子补丁相比,遍历所有 url 并装饰所有视图并不是一种 hack(这就是我在谈到“少些 hacky”时所想的)。但最有说服力的是,我可以保证学习制作装饰器的即时满足感。在你可以做装饰器之前,你会给你的代码一种你从未体验过的优雅。
  • 感谢您为我指明正确的方向。我将使用here 描述的方法处理我的一些基本视图。这似乎是一个非常干燥的选择。
【解决方案2】:

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

  1. 猴子补丁 django.template.base.RequestContext,设置 request.context = self.

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

  3. 将上下文处理器添加到设置中,一切顺利

这是一个示例,您可以将其粘贴到 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。

【讨论】:

  • 我忽略了 django-authority,因为它在 bitbucket 上似乎不活跃,但我会再看一下。我同意我宁愿不孤单地使用像你提到的那样的黑客。
  • 感谢您的详细回复。你让我相信上下文处理器不是处理这个问题的最佳方式。
猜你喜欢
  • 2013-05-04
  • 2016-07-01
  • 1970-01-01
  • 2014-05-23
  • 1970-01-01
  • 1970-01-01
  • 2011-08-19
  • 2011-08-14
  • 1970-01-01
相关资源
最近更新 更多