Python 可重用应用程序和访问控制
假设我创建了一个(希望是)可重用的应用程序,Python 可重用应用程序和访问控制,python,django,Python,Django,假设我创建了一个(希望是)可重用的应用程序,fooapp: url.py urls('^(?P<userid>\d+)/$', views.show_foo), 因为它是一个可重用的应用程序,所以它没有指定任何访问控制(例如,@login\u required) 在site/project url.py中,应用程序包括: urls('^foo/', include('fooapp.urls')), 我如何/在何处可以指定,在此网站中,只有员工才有权查看用户的foo 如果除了工作人
fooapp
:
url.py
urls('^(?P<userid>\d+)/$', views.show_foo),
因为它是一个可重用的应用程序,所以它没有指定任何访问控制(例如,@login\u required
)
在site/project url.py中,应用程序包括:
urls('^foo/', include('fooapp.urls')),
我如何/在何处可以指定,在此网站中,只有员工才有权查看用户的foo
如果除了工作人员之外,用户还应该能够查看自己的foo(login\u required
+request.user.id==userid
),该怎么办
我没有发现任何明显的参数要包括
注意:这与访问控制有关,而不是权限,即
要求工作人员检查User.is\u staff
,要求登录检查请求。用户是否已登录,用户查看自己的页面如上所述。这个问题与站点如何为可重用应用程序指定访问控制有关。好吧,我找到了一种方法,通过迭代Django的include返回的模式来工作:
from django.core.urlresolvers import RegexURLPattern, RegexURLResolver
def urlpatterns_iterator(patterns):
"""Recursively iterate through `pattern`s.
"""
_patterns = patterns[:] # create a copy
while _patterns:
cur = _patterns.pop()
if isinstance(cur, RegexURLPattern):
yield cur
elif isinstance(cur, RegexURLResolver):
_patterns += cur.url_patterns
else:
raise ValueError("I don't know how to handle %r." % cur)
def decorate(fn, (urlconf_module, app_name, namespace)):
"""Iterate through all the urls reachable from the call to include and
wrap the views in `fn` (which should most likely be a decorator).
(the second argument is the return value of Django's `include`).
"""
# if the include has a list of patterns, ie.: url(<regex>, include([ url(..), url(..) ]))
# then urlconf_module doesn't have 'urlpatterns' (since it's already a list).
patterns = getattr(urlconf_module, 'urlpatterns', urlconf_module)
for pattern in urlpatterns_iterator(patterns):
# the .callback property will set ._callback potentially from a string representing the path to the view.
if pattern.callback:
# the .callback property doesn't have a setter, so access ._callback directly
pattern._callback = fn(pattern._callback)
return urlconf_module, app_name, namespace
可以这样做:
from django.contrib.admin.views.decorators import staff_member_required as _staff_reqd
def staff_member_required(patterns): # make an include decorator with a familiar name
return decorate(_staff_reqd, patterns)
...
urls('^foo/', staff_member_required(include('fooapp.urls'))),
我想正确的方法是提供配置选项,如FOO\u ALLOW\u USER\u VIEW
或FOO\u REQUIRE\u STAFF
,以及您提供的一些默认值,这些默认值可以在站点配置中覆盖。@maazza否,不是该问题(或答案)的副本。我认为它们之间没有任何关系,只是访问控制可以使用权限——尽管我在这个问题上特别省略了对权限的需要。@b当你下载芹菜或其他第三方应用程序在Django项目中使用时,你必须在设置.py
中配置它,对吗?你可能需要你的fooapp的用户在他们的settings.py中配置它,在那里他们会告诉应用他们想要什么访问保护。我相信@Maciek正试图做到这一点。您的视图只需要用户具有CAN\u view\u FOO
位,例如user.have\u permissions('CAN\u view\u FOO')
,并且您在应用程序中给它一些默认值,但可以创建一个站点设置来覆盖该设置。。。
urls('^foo/', include('fooapp.urls')),
from django.contrib.admin.views.decorators import staff_member_required as _staff_reqd
def staff_member_required(patterns): # make an include decorator with a familiar name
return decorate(_staff_reqd, patterns)
...
urls('^foo/', staff_member_required(include('fooapp.urls'))),