01 werkzurg了解wsgi

1. wsgi

django和flask内部都没有实现socket,而是wsgi实现。

wsgi是web服务网关接口,他是一个协议,实现它的协议的有:wsgiref/werkzurg/uwsgi

  1. django之前

    from wsgiref.simple_server import make_server
    
    def run(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    return [bytes('<h1>Hello, web!</h1>', encoding='utf-8'), ] if __name__ == '__main__':
    httpd = make_server('127.0.0.1', 8000, run)
    httpd.serve_forever()
  2. flask之前

    from werkzeug.serving import run_simple
    from werkzeug.wrappers import BaseResponse def func(environ, start_response):
    print('请求来了')
    response = BaseResponse('你好')
    return response(environ, start_response) if __name__ == '__main__':
    run_simple('127.0.0.1', 5000, func)

2. flask之werkzurg源码流程

  1. 程序启动之app.run()

    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route('/index')
    def index():
    return 'hello world' if __name__ == '__main__':
    app.run()
  2. 执行里边run_simple方法的第三个参数加括号

    def run(self, host=None, port=None, debug=None, load_dotenv=True, **options):
    from werkzeug.serving import run_simple
    run_simple(host, port, self, **options)
  3. 触发执行__call__方法,然后去执行wsgi_app方法

    def __call__(self, environ, start_response):
    return self.wsgi_app(environ, start_response)
  4. 执行wsgi_app方法里边的full_dispatch_request方法

    def wsgi_app(self, environ, start_response):
    response = self.full_dispatch_request()
    return response(environ, start_response)

    full_dispatch_request

    def full_dispatch_request(self):
    return self.finalize_request(rv)
  5. 执行finalize_request方法,携带rv参数,rv为视图的返回值

    def finalize_request(self, rv, from_error_handler=False):
    response = self.make_response(rv)
    return response
  6. 执行finalize_request方法里边的make_response方法

    def make_response(self, rv):
    if not isinstance(rv, self.response_class):
    if isinstance(rv, (text_type, bytes, bytearray)):
    rv = self.response_class(rv, status=status, headers=headers)
    return rv
  7. response_class

    • response_class=Response
    • Response继承werkzurg的BaseResponse

3. 总结

  • 请求过来,经过一系列,最后由BaseResponse返回
from werkzeug.serving import run_simple
from werkzeug.wrappers import BaseResponse def func(environ, start_response):
print('请求来了')
response = BaseResponse('你好')
return response(environ, start_response) if __name__ == '__main__':
run_simple('127.0.0.1', 5000, func)

01 flask源码剖析之werkzurg 了解wsgi的更多相关文章

  1. flask源码剖析系列(系列目录)

    flask源码剖析系列(系列目录) 01 flask源码剖析之werkzurg 了解wsgi 02 flask源码剖析之flask快速使用 03 flask源码剖析之threading.local和高 ...

  2. 08 Flask源码剖析之flask拓展点

    08 Flask源码剖析之flask拓展点 1. 信号(源码) 信号,是在flask框架中为我们预留的钩子,让我们可以进行一些自定义操作. pip3 install blinker 2. 根据flas ...

  3. flask 源码剖析

    flask 上下文管理源码流程及涉及的部分技术点 [flask源码梳理]之一  偏函数_mro [flask源码梳理]之二  面向对象中__setattr__ [flask源码梳理]之三  Local ...

  4. Flask源码剖析详解

    1. 前言 本文将基于flask 0.1版本(git checkout 8605cc3)来分析flask的实现,试图理清flask中的一些概念,加深读者对flask的理解,提高对flask的认识.从而 ...

  5. 04 flask源码剖析之LocalStack和Local对象实现栈的管理

    04 LocalStack和Local对象实现栈的管理 目录 04 LocalStack和Local对象实现栈的管理 1.源码入口 1. flask源码关于local的实现 2. flask源码关于l ...

  6. 05 flask源码剖析之配置加载

    05 Flask源码之:配置加载 目录 05 Flask源码之:配置加载 1.加载配置文件 2.app.config源码分析 3.from_object源码分析 4. 总结 1.加载配置文件 from ...

  7. 06 flask源码剖析之路由加载

    06 Flask源码之:路由加载 目录 06 Flask源码之:路由加载 1.示例代码 2.路由加载源码分析 1.示例代码 from flask import Flask app = Flask(__ ...

  8. 07 flask源码剖析之用户请求过来流程

    07 Flask源码之:用户请求过来流程 目录 07 Flask源码之:用户请求过来流程 1.创建ctx = RequestContext对象 2. 创建app_ctx = AppContext对象 ...

  9. flask源码剖析

    这段时间想重新写个自己的博客系统,又正好在看一些框架源码,然后就想要不顺便写个小框架吧,既然想写框架,要不再顺便写个orm吧,再写个小的异步Server吧..事实证明饭要一口一口吃 先梳理一下flas ...

随机推荐

  1. centos7下docker的安装教程

    Centos7下docker安装教程以及踩过的那些坑 推荐在Centos下安装docker,在windows下安装docker可能会遇到很多的问题,而且docker官方推荐使用linux环境来使用do ...

  2. RESTORE FILELISTONLY FROM DISK ='D:\DataSQL\BakFile\pubs.bak' _ 数据库安装工具_连载_4

    在查询分析器中执行:  RESTORE FILELISTONLY FROM DISK = 'D:\DataSQL\BakFile\pubs.bak'根据查询类型判断Type(D.L),再取得对应的Lo ...

  3. cookie常用函数

    cookie常用函数 web_add_cookie:添加新的cookie或修改已经存在的cokkies web_remove_cookie:删除指定的cookie web_cleanup_cookie ...

  4. mybatis 学习教程

    https://www.cnblogs.com/ashleyboy/category/1246107.html

  5. deepin文件用途

    Bin:二进制文件, 存放二进制文件Dev:存放外接设备,其中外接设备不能被直接使用需要挂载(启动设备)Etc:存放配置文件Home:家目录,出了root用户外的其他用户类似于Windows中的use ...

  6. cb16a_c++_顺序容器的选用_排序_二分查找

    /*cb16a_c++_顺序容器的选用_排序_二分查找顺序容器: 1.vector的优点与缺点 vector优点:排序利用下标,快速排序,做二分查找非常快 2.list的优点与缺点 list优点:插入 ...

  7. ASP.NET Core 对Controller进行单元测试

    单元测试对我们的代码质量非常重要.很多同学都会对业务逻辑或者工具方法写测试用例,但是往往忽略了对Controller层写单元测试.我所在的公司没见过一个对Controller写过测试的.今天来演示下如 ...

  8. redis概要学习

    redis 概要学习 redis简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Re ...

  9. 从零开始学习Prometheus监控报警系统

    Prometheus简介 Prometheus是一个开源的监控报警系统,它最初由SoundCloud开发. 2016年,Prometheus被纳入了由谷歌发起的Linux基金会旗下的云原生基金会( C ...

  10. vue学习第一天:v-bind的使用(让属性绑定变量)

    v-bind的使用 v-bind: 是vue中,提供用于绑定属性的指令  例: <input type="button" value="按钮" title ...