如何让Tornado Web在current_user为None时返回403而非重定向到login_url?
问题解答
你的判断是正确的。从你给出的authenticated装饰器实现代码来看,当current_user为None时,逻辑分支明确:
- 如果请求方法是
GET或HEAD,会直接执行重定向到登录URL的逻辑,不会返回403状态码 - 只有非
GET/HEAD的请求,才会抛出HTTPError(403)
如果想要实现所有请求方法下,未登录时都返回403的效果,你可以自定义一个装饰器,修改原有的逻辑判断,去掉按请求方法分支的处理:
import functools from tornado.web import RequestHandler, HTTPError from typing import Callable, Optional, Awaitable def authenticated_403( method: Callable[..., Optional[Awaitable[None]]] ) -> Callable[..., Optional[Awaitable[None]]]: @functools.wraps(method) def wrapper( self: RequestHandler, *args, **kwargs ) -> Optional[Awaitable[None]]: if not self.current_user: raise HTTPError(403) return method(self, *args, **kwargs) return wrapper
之后在你的RequestHandler方法上使用这个自定义装饰器即可,无需依赖原有的login_url配置,只要未登录就会直接返回403状态码。
内容的提问来源于stack exchange,提问作者timewalker
相关产品推荐
相关产品推荐

