【问题标题】:How does tornado stop current request handler?龙卷风如何停止当前的请求处理程序?
【发布时间】:2014-03-21 08:29:22
【问题描述】:

有一些子类继承ManageHandler,每个子类都需要做私有检查。 所以,我写了private_auth,让它在__init__中做私有检查,并在GET/POST方法之前调用它。

如果私有检查失败,则返回 404 错误。但是,它不起作用。那么如何停止请求并返回错误页面呢?

我的代码贴在下面:

class ManageHandler(BaseHandler):

    def __init__(self, *argc, **argkw):
        super(ManageHandler, self).__init__(*argc, **argkw)
        self.private_auth()


    def private_auth(self):
        self.user = self.get_secure_cookie("user")
        self.private = self.UserModel.get_user_level_by_name(self.user)

        #not login
        if self.private == -1:
            return 

        if self.private != 4:
            self.render("404.html")
            self.finish()


    @tornado.web.authenticated
    def get(self, argkw={}):
            pass

Tornado 报告此错误。

[E 140321 02:06:04 iostream:357] Uncaught exception, closing connection.
    Traceback (most recent call last):
      File "/Library/Python/2.7/site-packages/tornado/iostream.py", line 354, in wrapper
        callback(*args)
      File "/Library/Python/2.7/site-packages/tornado/stack_context.py", line 331, in wrapped
        raise_exc_info(exc)
      File "/Library/Python/2.7/site-packages/tornado/stack_context.py", line 302, in wrapped
        ret = fn(*args, **kwargs)
      File "/Library/Python/2.7/site-packages/tornado/httpserver.py", line 328, in _on_headers
        self.request_callback(self._request)
      File "/Library/Python/2.7/site-packages/tornado/web.py", line 1651, in __call__
        handler = spec.handler_class(self, request, **spec.kwargs)
      File "/Users/tyw/Workspaces/CMPUT391/trunk/app/handlers/ManageHandler.py", line 23, in __init__
        self.private_auth()
      File "/Users/tyw/Workspaces/CMPUT391/trunk/app/handlers/ManageHandler.py", line 36, in private_auth
        self.finish()
      File "/Library/Python/2.7/site-packages/tornado/web.py", line 837, in finish
        self.flush(include_footers=True)
      File "/Library/Python/2.7/site-packages/tornado/web.py", line 784, in flush
        for transform in self._transforms:
    TypeError: 'NoneType' object is not iterable
[E 140321 02:06:04 ioloop:491] Exception in callback <functools.partial object at 0x10c63e1b0>
    Traceback (most recent call last):
      File "/Library/Python/2.7/site-packages/tornado/ioloop.py", line 477, in _run_callback
        callback()
      File "/Library/Python/2.7/site-packages/tornado/stack_context.py", line 331, in wrapped
        raise_exc_info(exc)
      File "/Library/Python/2.7/site-packages/tornado/stack_context.py", line 302, in wrapped
        ret = fn(*args, **kwargs)
      File "/Library/Python/2.7/site-packages/tornado/iostream.py", line 354, in wrapper
        callback(*args)
      File "/Library/Python/2.7/site-packages/tornado/stack_context.py", line 331, in wrapped
        raise_exc_info(exc)
      File "/Library/Python/2.7/site-packages/tornado/stack_context.py", line 302, in wrapped
        ret = fn(*args, **kwargs)
      File "/Library/Python/2.7/site-packages/tornado/httpserver.py", line 328, in _on_headers
        self.request_callback(self._request)
      File "/Library/Python/2.7/site-packages/tornado/web.py", line 1651, in __call__
        handler = spec.handler_class(self, request, **spec.kwargs)
      File "/Users/tyw/Workspaces/CMPUT391/trunk/app/handlers/ManageHandler.py", line 23, in __init__
        self.private_auth()
      File "/Users/tyw/Workspaces/CMPUT391/trunk/app/handlers/ManageHandler.py", line 36, in private_auth
        self.finish()
      File "/Library/Python/2.7/site-packages/tornado/web.py", line 837, in finish
        self.flush(include_footers=True)
      File "/Library/Python/2.7/site-packages/tornado/web.py", line 784, in flush
        for transform in self._transforms:
    TypeError: 'NoneType' object is not iterable

【问题讨论】:

    标签: python tornado


    【解决方案1】:

    Tornado 并非设计用于在 RequestHandler.__init__ 中执行身份验证和其他操作。这就是为什么当您从__init__ 调用self.finish 时会出现异常:RequestHandler 还没有准备好运行finish

    改为覆盖get_current_user()。基本说明在这里:

    http://tornado.readthedocs.org/en/latest/web.html#tornado.web.RequestHandler.get_current_user

    这里有一个例子:

    http://technobeans.wordpress.com/2012/08/14/tornado-authentication/

    在您的get_current_user() 中,不要设置self.userself.private,只返回一个元组。像这样的:

    def get_current_user(self):
        private = -1
        user = self.get_secure_cookie("user")
        if user:
            private = self.UserModel.get_user_level_by_name(self.user)
    
        return (user, private) if private == 4 else None
    

    Tornado 会处理剩下的事情。在您的get() 方法中,当前的(user, private) 元组将设置在self.current_user 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多