Flask中after_request的一个坑

2019-01-07  本文已影响0人  Allennnnnnn

flask的after_request函数一定要返回response

即使你没有对response做任何处理

你只有一个after_request函数的时候不会出现问题,一旦一些插件用到了after_request多半就会报错,类似于None type has no attribute xxx这样。

为什么

flask处理after_request是在下面这个方法里面,在app.py

    def process_response(self, response):
        """Can be overridden in order to modify the response object
        before it's sent to the WSGI server.  By default this will
        call all the :meth:`after_request` decorated functions.

        .. versionchanged:: 0.5
           As of Flask 0.5 the functions registered for after request
           execution are called in reverse order of registration.

        :param response: a :attr:`response_class` object.
        :return: a new response object or the same, has to be an
                 instance of :attr:`response_class`.
        """
        ctx = _request_ctx_stack.top
        bp = ctx.request.blueprint
        funcs = ctx._after_request_functions
        if bp is not None and bp in self.after_request_funcs:
            funcs = chain(funcs, reversed(self.after_request_funcs[bp]))
        if None in self.after_request_funcs:
            funcs = chain(funcs, reversed(self.after_request_funcs[None]))
        for handler in funcs:
            response = handler(response)
        if not self.session_interface.is_null_session(ctx.session):
            self.session_interface.save_session(self, ctx.session, response)
        return response

问题就在这两句

funcs = ctx._after_request_functions
for handler in funcs:
        response = handler(response)

所有after_request依次处理一个response对象,所以不管怎么样都得返回

上一篇下一篇

猜你喜欢

热点阅读