所以我有一个名为stats的应用程序,它允许我以各种方式查询我的数据库并以JSON格式返回信息,因此我可以有一个很好的ajaxy仪表板用于绘图和可视化。我希望这个应用程序尽可能可重用,所以我不想在其视图上使用@login_required装饰器。但是,在我的情况下,我做希望在查看任何应用视图之前需要登录。有没有办法在视图以外的地方做到这一点?
在我网站的urls.py中也许是这样的? (我知道这不起作用,我正在寻找的一个例子)
urlpatterns = patterns('',
(r'^stat/', include('stats.urls'), login_required),
)
答案 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
未经测试,但您明白了。