【问题标题】:Is it possible to redirect inside a middleware class?是否可以在中间件类中重定向?
【发布时间】:2022-04-28 04:08:33
【问题描述】:
class Middleware:
    def __init__(self, app):
        self.app = app


    def __call__(self, environ, start_response):
        request = Request(environ)
        cookies = request.cookies
        path = request.path
        

        if not isAuthenticated(cookies):
            #Redirect to /login

        return self.app(environ, start_response)

所以我有一个Middleware 类,它应该从request 获取cookies,然后将其发送到函数isAuthenticated,如果函数返回,该函数现在返回TrueFalse False 我需要重定向到/login 页面,这可能吗?即使我没有 request 对象,我也只有 environ?

【问题讨论】:

    标签: python flask


    【解决方案1】:

    不确定。因为 WSGI 中间件位于应用程序本身之外的一层。

    您可以使用other hooks 在应用程序/请求上下文中工作。在这种情况下你可以使用flask.requestflask.redirect()等。顺便说一下,你不需要初始化请求(request = Request (Environment))。

    【讨论】:

    • 问题是我希望这个中间件在所有路由上运行,而不是手动添加到每个路由。
    • @KadiemAlqazzaz 我明白了。请参阅链接中的before_request_funcsbefore_request ?
    【解决方案2】:

    可以使用 HTTP 301 重定向:

    class PrefixMiddleware(object):
    
        def __init__(self, app, prefix=''):
            self.app = app
            self.prefix = prefix
    
        def __call__(self, environ, start_response):
            if environ['PATH_INFO'].startswith(self.prefix):
                environ['PATH_INFO'] = environ['PATH_INFO'][len(self.prefix):]
                environ['SCRIPT_NAME'] = self.prefix
                return self.app(environ, start_response)
            else:
                start_response('301', [('Location', self.prefix)])
                return ["Redirecting to application...".encode()]
    

    【讨论】:

      猜你喜欢
      • 2011-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-22
      • 2022-08-20
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      相关资源
      最近更新 更多