2016-11-29 15 views
2

すべてのページに効果的に@login_requiredを作成するミドルウェアを作成しています。残念ながら、私はリダイレクトループの結果を得ています。Django 1.10:ログインに必要なミドルウェアのリダイレクトループ

実装は、ユーザーが認証されていないときは常にログインページにリダイレクトするための試みでMiddlewareMixinを経由して1.10とprocess_request()フックと「古い」スタイルのミドルウェアを使用しています。

まず、デフォルトのauth URL django.contrib.auth.urlsを使用しています。 docsは言う:^login/$ [name='login'] ...

# main URLConf urls.py 
urlpatterns = [ 
    url(r'^admin/', admin.site.urls), 
    url(r'^', include('django.contrib.auth.urls')), # https://docs.djangoproject.com/en/1.10/topics/auth/default/#module-django.contrib.auth.views 
] 

は次にここに(はい、それはsettings.pyMIDDLEWAREに追加されます)ミドルウェアです:

from django.http import HttpResponseRedirect 
from django.utils.deprecation import MiddlewareMixin 

class LoginRequiredMiddleware(MiddlewareMixin): 

    def process_request(self, request): 
     if not request.user.is_authenticated(): 
      return HttpResponseRedirect('/login/') 

これは、次のURLパターンが含まれます

私のミドルウェアが含まれていない場合、ログインページ/機能が正常に機能します。すべてのURLのltsはERR_TOO_MANY_REDIRECTSを引き起こします。

私には何が欠けていますか?ありがとう。

答えて

3

Doh! /login/process_requestにチェックして無視する必要がありました。

ここには実装されているものの簡略化されたバージョンがあります。実際のバージョンでは、settings.pyとregexesを使用してログインの免除URLを定義しています。ライアン・ウィットのpostには、このアプローチに関する多くの功績があります。

class LoginRequiredMiddleware(MiddlewareMixin): 

    def process_request(self, request): 
     if not request.user.is_authenticated(): 
      path = request.path_info.lstrip('/') 
      # If path is not root url ('') and path is not exempt from authentication 
      if not path or not any(path != eu for eu in ["/login", "admin"]): 
       return HttpResponseRedirect("/login/") 
+0

@PrakharTrivedi私はそれを得ました。しばらくのうちに私の答えにいくつかの詳細を追加します。ありがとう。 –

関連する問題