【问题标题】:Tornado, how to drop POST/GET with 401 if a token is not providedTornado,如果未提供令牌,如何使用 401 删除 POST/GET
【发布时间】:2021-12-29 02:26:34
【问题描述】:

如果标头中未提供令牌字段,我想删除 GET/POST 请求。

目前我使用this code (from GitHub Gist):

def require_basic_auth(handler_class):
    def wrap_execute(handler_execute):
        def serve_error(handler, status):
            handler._transforms = []  # necessary
            handler.set_status(status)
            handler.finish()

        def _execute(self, transforms, *args, **kwargs):
            expected_header = self.request.headers.get('X-User-Auth')

            if expected_header is None:
                return serve_error(self, 403)

            kwargs['token'] = expected_header
            # Token validation is done in the `post(self, token)` method

            return handler_execute(self, transforms, *args, **kwargs)

        return _execute

    handler_class._execute = wrap_execute(handler_class._execute)

    return handler_class

两个问题:

  1. 它修补了_method,而且我对操作名称以_ 开头的方法有点不舒服
  2. 导致未捕获异常错误:AttributeError: '_NullFuture' object has no attribute 'add_done_callback'

阅读了一下,我发现.prepare() 方法可能是实现这一点的最佳方法。但是我在.prepare() 中没有找到任何关于如何正确执行此操作的示例。

有人可以给我举个例子吗?


编辑 1

我忘了补充:上面的装饰器还方便地将标头提取到一个token kwarg 以供post(self, token) 方法使用。如果使用prepare(self),我不确定该怎么做。

【问题讨论】:

    标签: python tornado


    【解决方案1】:

    是的,直接修补 Tornado 的RequestHandler 不太理想。

    使用 Tornado,您应该为您的处理程序创建一个基类。这个基类就像在其他框架(Django、Flask 等)中看到的“中间件”

    Tornado 的另一种模式是创建“mixin”类,这对于将通用功能插入特定处理程序很有用。

    这是我在项目中所做的:

    class BaseHandler(web.RequestHandler):
        def prepare(self):
            expected_header = self.request.headers.get('X-User-Auth')
            
            if not expected_header:
                return self.send_error(401)
    
            # ... other common logic to run before other methods ...
    
    
    # Inherit your handlers from BaseHandler everywhere
    class MyHandler(BaseHandler):
        def get(self):
            pass
    

    【讨论】:

    • 嘿,这是个好主意,制作 mixin 类!谢谢,很好的例子!
    猜你喜欢
    • 1970-01-01
    • 2018-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 2018-01-31
    • 2019-06-23
    相关资源
    最近更新 更多