Django 仅限认证用户的 URL 分组

1 投票
3 回答
2509 浏览
提问于 2025-04-18 11:41

我正在尝试创建一个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 个回答

0

你可以使用 @login_required 这个装饰器:

点击这里查看详细文档

根据文档的说明:

login_required() 的作用是:

如果用户没有登录,就会把他引导到设置中的登录页面,并且在网址中带上他原本想访问的页面地址。比如说:/accounts/login/?next=/polls/3/。

如果用户已经登录,那么就会正常执行后面的代码。这样一来,代码就可以放心地假设用户已经登录了。

from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
   ...
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):
    ...
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 (...)

这样每次在处理网址请求时,它都会检查用户是否已经登录。

另外,如果你使用基于类的视图,你还可以重写 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")

撰写回答