Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 可重用应用程序和访问控制_Python_Django - Fatal编程技术网

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'))),