You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 06:09:55