2013-09-01 73 views
9

目前我使用這些模式來登錄和退出重定向如果已經通過Django網址登錄?

urlpatterns += patterns("", 
    (r'^login/$', 'django.contrib.auth.views.login', {'template_name': 'login.html'}), 
    (r'^logout/$', 'django.contrib.auth.views.logout', {'template_name': 'logout.html'}) 
) 

有LOGIN_REDIRECT_URL =的Inspite「/資料/」在我的settings.py,Django不派我去/型材/如果我想訪問/登錄/當我已經登錄...

我可以以某種方式重定向到auth系統的URL模式嗎?我不願意爲此寫一個自定義視圖。

回答

21

我用這樣的事情在我的urls.py:

from django.contrib.auth.views import login 
from django.contrib.auth.decorators import user_passes_test 


login_forbidden = user_passes_test(lambda u: u.is_anonymous(), '/') 

urlpatterns = patterns('', 
    url(r'^accounts/login/$', login_forbidden(login), name="login"), 
+0

這非常酷!感謝這段代碼 – Jurudocs

+1

+1完美地工作,我更喜歡使用我的url名稱,以防萬一我的路徑改變,改變了答案'login_forbidden = user_passes_test(lambda u:u.is_anonymous(),lazy(reverse,str)('my -url-name'))' – shabeer90

+0

您可以通過設置'redirect_field_name = None'來刪除'?next' url參數(請參閱[Remove?next](http://stackoverflow.com/a/12764484/2228912) )。該參數在用戶重定向後出現在url中(例如,如果他在這種情況下被認證)。 – h4k1m

1

如何乘坐Django login視圖?如果你想要做的東西在模板本身別人的註冊用戶

if request.user.is_authenticated(): 
     # Redirect to profile 

{% if user.is_authenticated %} 
1

縱觀source code在Github上

然後添加此一小段代碼在該視圖,如果通過POST請求提交登錄表單並且它沒有參數next,則由django.contrib.auth提供的默認login視圖將僅使用LOGIN_REDIRECT_URL。 (docs也提到了這一點)。

login觀點實際上並沒有做的,無論你已經或沒有任何身份驗證檢查 - 這樣一個已認證的用戶打一個標準的GET請求將看到登錄窗體頁再次 - 同樣作爲未經認證的用戶。

如果你想要不同的行爲,我建議你寫自己的登錄視圖。

2

我最後寫了這樣的任務一個裝飾。

請注意,我已經快速&髒。

from django.conf import settings 
from django.shortcuts import redirect 


def redirect_if_logged(f=None, redirect_to_url=None): 
    u""" 
    Decorator for views that checks that the user is already logged in, redirecting 
    to certain URL if so. 
    """ 
    def _decorator(view_func): 
     def _wrapped_view(request, *args, **kwargs): 
      if request.user.is_authenticated(): 
       redirect_url = redirect_to_url 

       if redirect_to_url is None: 
        # URL has 'next' param? 
        redirect_url_1 = request.GET.get('next') 
        # If not, redirect to referer 
        redirect_url_2 = request.META.get('HTTP_REFERER') 
        # If none, redirect to default redirect URL 
        redirect_url_3 = settings.LOGIN_REDIRECT_URL 

        redirect_url = redirect_url_1 or redirect_url_2 or redirect_url_3 

       return redirect(redirect_url, *args, **kwargs) 
      else: 
       return view_func(request, *args, **kwargs) 
     return _wrapped_view 

    if f is None: 
     return _decorator 
    else: 
     return _decorator(f) 
相關問題