【问题标题】:How to handle generator code inside a decorator?如何在装饰器中处理生成器代码?
【发布时间】:2023-03-29 11:14:01
【问题描述】:

我正在尝试编写 login_required 装饰器,用于使用 WSGI 中间件对 Django 中受保护视图的请求进行身份验证。

这是我的代码:

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 = [response.next() 中项目的项目]

然后我得到以下错误:

TypeError: unhashable type: 'list'

【问题讨论】:

    标签: python django wsgi python-decorators


    【解决方案1】:

    可以参考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)
    

    【讨论】:

    • 这不起作用,因为重定向是通过 WSGI 中间件到 Google OAuth 登录页面完成的。
    猜你喜欢
    • 2016-12-01
    • 2020-03-04
    • 2022-07-01
    • 2021-11-14
    • 1970-01-01
    • 2012-12-04
    • 2019-10-01
    • 2019-10-21
    • 1970-01-01
    相关资源
    最近更新 更多