我正在尝试创建Django web项目,并且有一些User后端应用程序,其中每个URL(视图)仅适用于经过身份验证的用户。
我可以在每个视图中写一个条件,例如:
用户/ urls.py
urlpatterns = patterns('',
url(r'^settings/', 'User.views.user_settings'),
url(r'^profile/', 'User.views.profile'),
#Other User Admin panel Urls
)
用户/ views.py
def user_settings(request):
if request.user is None:
return redirect('/login')
#Some other code
def profile(request):
if request.user is None:
return redirect('/login')
#Some other code
正如你所看到的那样,编码不好,但效果很好。 我唯一想知道的是,可以为 urls.py 文件添加一些条件,以便在每个视图函数中都不添加相同的代码行。
例如Symfony,Laravel和Yii框架就像我想做的那样。 是否可以在Django中执行此操作? :)
在此编辑
使用@login_required
我需要为每个视图添加它,例如,我需要为所有网址添加内容:
在Symfony框架中我可以写
{ path: ^/myPage, roles: AUTHENTICATED }
将会要求/myPage/someUrl
这样的每个网址进行身份验证。
我相信Django有类似的东西:)
感谢。
答案 0 :(得分:0)
您可以使用@login_required
装饰器:
https://docs.djangoproject.com/en/1.5/topics/auth/default/#the-login-required-decorator
来自文档:
login_required()执行以下操作:
如果用户未登录,请重定向到settings.LOGIN_URL,在查询字符串中传递当前绝对路径。例如:/ accounts / login /?next = / polls / 3 /.
如果用户已登录,请正常执行视图。视图代码可以自由地假设用户已登录。
from django.contrib.auth.decorators import login_required
@login_required
def my_view(request):
...
答案 1 :(得分:0)
您可以使用此:https://docs.djangoproject.com/en/1.6/topics/auth/default/#the-login-required-decorator
from django.contrib.auth.decorators import login_required
@login_required
def my_view(request):
...
答案 2 :(得分:0)
如果您使用基于类的视图,则可以更轻松地添加@login_required。例如,您可以在此处创建基于类的视图:
class BaseView(TemplateView):
@method_decorator(login_required)
def dispatch(self, request, *args, **kwargs):
return super(BaseView, self).dispatch(*args, **kwargs)
现在,每次要创建新视图时都会覆盖它。例如:
class SettingsView(BaseView):
def get(request):
return (...)
如果用户已登录,它将每次在url dispatch处检查。
此外,如果您使用基于类的视图,则可以覆盖get()
以检查用户是否已通过身份验证。
class BaseView(TemplateView):
template_name= None
role= None
def get(self, request, *args, **kwargs):
if request.user is not None and role is "AUTHENTICATE":
return super(BaseView, self).get(request, *args, **kwargs)
else:
raise Exception('user is not logged in')
urls.py:
url(r'^settings/', BaseView.as_view(template_name='/sometemplate', role="AUTHENTICATE")