Django 仅限认证用户的 URL 分组
我正在尝试创建一个Django网页项目,里面有一些用户后台应用,所有的URL(视图)都只允许经过身份验证的用户访问。
我可以在每个视图中写一个条件,比如说:
User/urls.py
urlpatterns = patterns('',
url(r'^settings/', 'User.views.user_settings'),
url(r'^profile/', 'User.views.profile'),
#Other User Admin panel Urls
)
User/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中实现这样的效果。
在Django中可以做到这一点吗? :)
这里补充一下
使用@login_required
我需要在每个视图中都添加这个装饰器,我想要的是对所有的URL都能生效,比如说:
在Symfony框架中,我可以写
{ path: ^/myPage, roles: AUTHENTICATED }
,这样每个像/myPage/someUrl
这样的URL都会要求用户进行身份验证。
我相信Django也有类似的功能 :)
谢谢。
3 个回答
你可以使用 @login_required
这个装饰器:
根据文档的说明:
login_required() 的作用是:
如果用户没有登录,就会把他引导到设置中的登录页面,并且在网址中带上他原本想访问的页面地址。比如说:/accounts/login/?next=/polls/3/。
如果用户已经登录,那么就会正常执行后面的代码。这样一来,代码就可以放心地假设用户已经登录了。
from django.contrib.auth.decorators import login_required
@login_required
def my_view(request):
...
你可以使用这个链接来了解更多信息: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):
...
如果你使用基于类的视图,这样可以更方便地添加 @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 (...)
这样每次在处理网址请求时,它都会检查用户是否已经登录。
另外,如果你使用基于类的视图,你还可以重写 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")