Django Url组仅适用于经过身份验证的用户

时间:2014-07-01 06:18:23

标签: python django

我正在尝试创建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有类似的东西:)


感谢。

3 个答案:

答案 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")