如何指定除了Django中的视图之外的某处需要登录?

时间:2010-01-31 03:28:28

标签: django authentication

所以我有一个名为stats的应用程序,它允许我以各种方式查询我的数据库并以JSON格式返回信息,因此我可以有一个很好的ajaxy仪表板用于绘图和可视化。我希望这个应用程序尽可能可重用,所以我不想在其视图上使用@login_required装饰器。但是,在我的情况下,我希望在查看任何应用视图之前需要登录。有没有办法在视图以外的地方做到这一点?

在我网站的urls.py中也许是这样的? (我知道这不起作用,我正在寻找的一个例子)

urlpatterns = patterns('',
        (r'^stat/', include('stats.urls'), login_required), 
)

3 个答案:

答案 0 :(得分:6)

您可以通过以下方式在urls.py中为各个网址应用装饰器:

from django.contrib.auth.decorators import login_required
import views

(r'^stat/', login_required(views.index))

答案 1 :(得分:3)

你可以使用中间件

这是示例代码段 - http://www.djangosnippets.org/snippets/1179/

您可以使用此代码段并在设置中定义LOGIN_EXEMPT_URLS,或者根据您的情况稍微修改一下

答案 2 :(得分:2)

如果您担心可重用性,而不是使用login_required,则可以使用装饰器,如果将特定参数传递给视图,则需要登录(可能默认值为True )。在我的头顶,它可能看起来像这样:

from django.contrib.auth.decorators import login_required

def login_possibly_required(view_func):
    def inner(request, *args, **kwargs):
        try:
            require_login = kwargs.pop('require_login')
            if require_login:
                return login_required(view_func)(request, *args, **kwargs)
        except KeyError:
            pass
        return view_func(request, *args, **kwargs)
    return inner

然后你就像这样定义你的观点:

@login_possibly_required
my_view(request, arg1, arg2, require_login=True):
    pass

未经测试,但您明白了。