当前位置:   article > 正文

Flask源码剖析(六):响应是怎么实现的_flask full_dispatch_request

flask full_dispatch_request

前言

接着此前Flask源码剖析系列,这次来看看Flask是怎么样生成响应的。

基本使用

Flask会将视图函数返回的值作为Response返回给客户端,这一步对Flask框架使用者而言是透明的,最基本的用法如下:

@app.route('/')
def hello():
    return 'Hello, 二两!', 200, {
   'Content-Type': 'application/json'}
  • 1
  • 2
  • 3
  • 4

在hello方法中,返回了了http状态、body以及header等,该方法返回的其实是一个tuple,这里究竟发送了什么?才让一个tuple变为一个Response。

Flask中的响应(Response)

在本系列第一篇文章「Flask源码剖析(一):Flask启动流程」中提到了full_dispatch_request()方法,该方法会找到当前请求路由对应的方法,调用该方法,获得返回(即response),如果请求路由不存在,则进行错误处理,返回500错误。

在full_dispatch_request()方法中会调用finalize_request()方法对返回数据进行处理,response对象的构建就在该方法中实现,该方法源码如下。

# flask/app.py/Flask

    def finalize_request(self, rv, from_error_handler=False):
        response = self.make_response(rv)
        try:
            response = self.process_response(response)
            request_finished.send(self, response=response)
        except Exception:
            if not from_error_handler:
                raise
            self.logger.exception(
                "Request finalizing failed with an error while handling an error"
            )
        return response
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

finalize_request()方法调用make_response()方法将视图函数返回的tuple转为了response对象,随后再通过process_response()方法进行了相关的hooks处理,具体而言就是执行ctx._after_request_functions变量中存放的方法。

这里重点看一下make_response()方法,其源码如下。

    def make_response(self, rv):
        status = headers = None

        if isinstance(rv, tuple):
            len_rv = len(rv)

            if len_rv == 3:
                rv, status, headers = rv
            elif len_rv == 2:
                if isinstance(rv[1], (Headers, dict, tuple, list)):
                    rv,<
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/414381
推荐阅读
相关标签
  

闽ICP备14008679号