在Middleware中间件类内仅用environ能否实现跳转到/login页面?
WSGI中间件无Request对象实现登录跳转方案
完全可以实现,WSGI规范下所有请求信息都存储在environ字典中,不需要依赖额外的Request封装类就能完成Cookie读取、路径判断和302跳转逻辑。
修改后的完整代码如下:
from http.cookies import SimpleCookie class Middleware: def __init__(self, app): self.app = app def __parse_cookies(self, cookie_str): # 基于标准库解析Cookie字符串为字典,兼容原有isAuthenticated校验逻辑 cookies = {} if not cookie_str: return cookies sc = SimpleCookie() sc.load(cookie_str) for key, morsel in sc.items(): cookies[key] = morsel.value return cookies def __call__(self, environ, start_response): # 直接从environ取所需请求数据,无需依赖Request对象 cookie_str = environ.get('HTTP_COOKIE', '') cookies = self.__parse_cookies(cookie_str) current_path = environ.get('PATH_INFO', '') # 身份校验失败且当前不是登录页时执行跳转,避免无限重定向 if not isAuthenticated(cookies) and current_path != '/login': start_response( '302 Found', [ ('Location', '/login'), ('Content-Length', '0') ] ) # 302跳转不需要返回响应内容 return [] return self.app(environ, start_response)
核心逻辑说明
- 所有请求信息都可以直接从environ字典中获取:
- 请求路径对应
environ['PATH_INFO'],等价于原来的request.path - 请求的原始Cookie字符串对应
environ.get('HTTP_COOKIE', ''),解析后等价于原来的request.cookies
- 请求路径对应
- 302重定向完全符合WSGI规范:仅需要通过
start_response设置状态码为302 Found,在响应头中添加Location字段指向登录地址,返回空列表作为响应体即可完成跳转,不需要调用后续的self.app逻辑。 - 新增了登录页路径判断,防止访问
/login时仍触发跳转导致无限重定向。
内容的提问来源于stack exchange,提问作者Kadiem Alqazzaz
相关产品推荐
相关产品推荐

