Python tornado如何停止当前的请求处理程序?

Python tornado如何停止当前的请求处理程序?,python,tornado,Python,Tornado,有一些子类继承ManageHandler,每个子类都需要进行私有检查。 因此,我编写了private\u auth,让它在\uuu init\uuu中执行私有检查,并在GET/POST方法之前调用它 如果私有检查失败,只需返回404错误。然而,它不起作用。那么,如何停止请求并返回错误页面呢 我的代码贴在下面: class ManageHandler(BaseHandler): def __init__(self, *argc, **argkw): super(Manag

有一些子类继承
ManageHandler
,每个子类都需要进行私有检查。 因此,我编写了
private\u auth
,让它在
\uuu init\uuu
中执行私有检查,并在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
龙卷风报告这个错误

[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
[E 140321 02:06:04 iostream:357]未捕获异常,正在关闭连接。
回溯(最近一次呼叫最后一次):
包装器中的文件“/Library/Python/2.7/site packages/tornado/iostream.py”,第354行
回调(*args)
文件“/Library/Python/2.7/site packages/tornado/stack_context.py”,第331行,包装为
提升exc信息(exc)
文件“/Library/Python/2.7/site packages/tornado/stack_context.py”,第302行,包装为
ret=fn(*args,**kwargs)
文件“/Library/Python/2.7/site packages/tornado/httpserver.py”,第328行,在标题中
self.request\u回调(self.request)
文件“/Library/Python/2.7/site packages/tornado/web.py”,第1651行,在__
handler=spec.handler\u类(self、request、**spec.kwargs)
文件“/Users/tyw/workspace/CMPUT391/trunk/app/handlers/ManageHandler.py”,第23行,在__
self.private_auth()
文件“/Users/tyw/workspace/CMPUT391/trunk/app/handlers/ManageHandler.py”,第36行,以私人身份
self.finish()
文件“/Library/Python/2.7/site packages/tornado/web.py”,第837行,完成
self.flush(include_footers=True)
文件“/Library/Python/2.7/site packages/tornado/web.py”,第784行,齐平
对于自转换。\u转换:
TypeError:“非类型”对象不可编辑
[E 140321 02:06:04 ioloop:491]回调中出现异常
回溯(最近一次呼叫最后一次):
文件“/Library/Python/2.7/site packages/tornado/ioloop.py”,第477行,在运行回调中
回调函数()
文件“/Library/Python/2.7/site packages/tornado/stack_context.py”,第331行,包装为
提升exc信息(exc)
文件“/Library/Python/2.7/site packages/tornado/stack_context.py”,第302行,包装为
ret=fn(*args,**kwargs)
包装器中的文件“/Library/Python/2.7/site packages/tornado/iostream.py”,第354行
回调(*args)
文件“/Library/Python/2.7/site packages/tornado/stack_context.py”,第331行,包装为
提升exc信息(exc)
文件“/Library/Python/2.7/site packages/tornado/stack_context.py”,第302行,包装为
ret=fn(*args,**kwargs)
文件“/Library/Python/2.7/site packages/tornado/httpserver.py”,第328行,在标题中
self.request\u回调(self.request)
文件“/Library/Python/2.7/site packages/tornado/web.py”,第1651行,在__
handler=spec.handler\u类(self、request、**spec.kwargs)
文件“/Users/tyw/workspace/CMPUT391/trunk/app/handlers/ManageHandler.py”,第23行,在__
self.private_auth()
文件“/Users/tyw/workspace/CMPUT391/trunk/app/handlers/ManageHandler.py”,第36行,以私人身份
self.finish()
文件“/Library/Python/2.7/site packages/tornado/web.py”,第837行,完成
self.flush(include_footers=True)
文件“/Library/Python/2.7/site packages/tornado/web.py”,第784行,齐平
对于自转换。\u转换:
TypeError:“非类型”对象不可编辑

Tornado不是为在
请求处理程序中执行身份验证和其他操作而设计的。这就是为什么从
\uuu init\uuu
调用
self.finish
时会出现异常:RequestHandler尚未准备好运行
finish

相反,重写
获取当前用户()。基本说明如下:

这里有一个例子:

get\u current\u user()
中,不要设置
self.user
self.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
剩下的就交给龙卷风了。在
get()
方法中,将在
self.current\u user
中设置当前
(用户,私有)
元组