2014-07-01 39 views
1

我试图创建Django的web项目,并且有一些用户后端应用程序,其中每个URL(视图)仅用于经过身份验证的用户。
用户/ urls.pyDjango的Url组只为经过身份验证的用户

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 }和每一个URL像这个/myPage/someUrl将被要求认证。
我认为Django的有类似的东西:)


感谢。

回答

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调度每一次检查,如果你使用基于类的视图,您可以覆盖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") 
+0

谢谢回答。这真的很有用:) –

0

可以使用@login_required装饰: https://docs.djangoproject.com/en/1.5/topics/auth/default/#the-login-required-decorator

从文档:

login_required()执行以下操作:

如果用户没有登录,重定向到设置.LOGIN_URL,传递查询字符串中的当前绝对路径。例如:/ accounts/login /?next =/polls/3 /。

如果用户已登录,则正常执行视图。视图代码是免费承担用户登录

from django.contrib.auth.decorators import login_required 

@login_required 
def my_view(request): 
    ... 
相关问题