2016-10-14 5 views
0

WSGIミドルウェアを使用してDjangoの保護されたビューにリクエストを認証するためのlogin_requiredデコレータを作成しようとしています。ここでデコレータ内でジェネレータコードを処理する方法は?

は私のコードです:

def login_required(f, request_class=HTTPRequest): 
    def _wrapper(*args, **kwargs): 
     if not isinstance(args[0], request_class): 
      req = request_class(environ=args[0]) 
     else: 
      req = args[0] 
     wsgi_app = WSGIController() 
     settings = wsgi_app.settings     
     google_client = client.GoogleClient(
      settings.OAUTH2_CLIENT_ID, 
      access_token=settings.OAUTH2_ACCESS_TOKEN, 
      scope='email', 
      redirect_url=settings.OAUTH2_REDIRECT_URL, 
      login_path="/session_login/") 

     wsgi_app = google_client.wsgi_middleware(wsgi_app, \ 
      secret=settings.SECRET_KEY) 
     def process_middleware(environ, start_response): 
      return wsgi_app(environ, start_response) 
     response = process_middleware(req.environ, f) 
     return f(*args, **kwargs) 
    return _wrapper 

は、どのように私はOAuthのログインページにユーザーをリダイレクトするために応答オブジェクト(発電機)を扱うことができますか?

アップデート:私は次のコードを追加する場合:

redirect = [item for item in response.next()]

をその後、私は次のエラーを取得する:

TypeError: unhashable type: 'list'

答えて

0

あなたはdjango/contrib/auth/decoractors.py

にlogin_requiredデコレータロジックに参照することができますそれが作りますredirect_to_loginを使用すると、ログインチェックが失敗したときにログインページにリダイレクトされます。

from django.contrib.auth.views import redirect_to_login 
return redirect_to_login(path, resolved_login_url, redirect_field_name) 
+0

リダイレクトがWSGIミドルウェア経由でGoogle OAuthログインページに送信されるため、これは機能しません。 –

関連する問題