如何处理装饰器内的生成器代码? [英] How to handle generator code inside a decorator?
问题描述
这是我的代码:
我试图写一个login_required装饰器,用于使用WSGI中间件在Django中将请求验证到受保护的视图。 b$ b
def login_required(f,request_class = HTTPRequest):
def _wrapper(* args,** kwargs):
如果没有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_mi ddleware(environ,start_response):
return wsgi_app(environ,start_response)
response = process_middleware(req.environ,f)
return f(* args,** kwargs)
返回_wrapper
如何处理响应对象(生成器)将用户重定向到oauth登录页面?
更新:如果我添加以下代码:
redirect = [ item for item in response.next()]
然后我收到以下错误:
TypeError:unhashable类型:'list'
您可以参考 django / contrib / auth / decoractors.py
中的login_required装饰器逻辑使用 redirect_to_login
函数在登录检查失败时重定向到登录页面。
from django.contrib.auth.views im port redirect_to_login
return redirect_to_login(path,resolved_login_url,redirect_field_name)
I'm attempting to write a login_required decorator for authenticating requests to a protected view in Django using a WSGI middleware.
Here's my code:
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
How can I handle the response object (generator) to redirect the user to the oauth login page ?
Update: If I add the following code:
redirect = [item for item in response.next()]
Then I get the following error:
TypeError: unhashable type: 'list'
You can reference to the login_required decorator logic in django/contrib/auth/decoractors.py
It make use of redirect_to_login
function to redirect to login page when login check is failed.
from django.contrib.auth.views import redirect_to_login
return redirect_to_login(path, resolved_login_url, redirect_field_name)
这篇关于如何处理装饰器内的生成器代码?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!