01 werkzurg了解wsgi

1. wsgi

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

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

  1. django之前

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

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

2. flask之werkzurg源码流程

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

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

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

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

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

    full_dispatch_request

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

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

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

    • response_class=Response
    • Response继承werkzurg的BaseResponse

3. 总结

  • 请求过来,经过一系列,最后由BaseResponse返回
  1. from werkzeug.serving import run_simple
  2. from werkzeug.wrappers import BaseResponse
  3. def func(environ, start_response):
  4. print('请求来了')
  5. response = BaseResponse('你好')
  6. return response(environ, start_response)
  7. if __name__ == '__main__':
  8. 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. yii2中的场景使用

    下面给大家介绍一下 yii2.0 场景的使用.小伙多唠叨一下了,就是担心有的人还不知道,举个简单的例子,现在在 post表里面有 title image content 三个的字段,当我创建一个 po ...

  2. iOSdelegate、Notification、block区别

    1.delegate与block一般用于1对1的通信交互.delegate需先定义好协议方法,代理对象实现协议方法且需要建立代理关系才可以通信. 2.block使用简洁,如果通信事件较多,建议使用de ...

  3. 2019-02-09 python爬取mooc视频项目初级简单版

    今天花了一下午时间来做这东西,之前没有自己写过代码,50几行的代码还是查了很多东西啊,果然学起来和自己动起手来完全是两码事. 方案:requests库+正则表达式提取视频下载链接+urlretriev ...

  4. python第三方库大全

    环境管理 管理 Python 版本和环境的工具 p:非常简单的交互式 python 版本管理工具.官网 pyenv:简单的 Python 版本管理工具.官网 Vex:可以在虚拟环境中执行命令.官网 v ...

  5. idea Version Control 版本控制窗口/视图显示

    原文链接:https://blog.csdn.net/torpidcat/article/details/86471745 显示方式: 或者:

  6. Web api配置填坑攻略

    最近开始使用web api,开发调试过程还算顺利,现在项目已经发布,网站已经部署,结果浏览过程出现问题(不出问题好像不正常吧……),做个note开始填坑. 1.1号坑 咋一开始就爆出另一个程序正在使用 ...

  7. GoAccess分析Web日志

    简介 为什么要用GoAccess? GoAccess 被设计成快速的并基于终端的日志分析工具.其核心理念是不需要通过 Web 浏览器就能快速分析并实时查看 Web 服务器的统计数据(这对于需要使用 S ...

  8. Spring事务深入剖析--spring事务失效的原因

    之前我们讲的分布式事务的调用都是在一个service中的事务方法,去调用另外一个service中的业务方法, 如果在一个sevice中存在两个分布式事务方法,在一个seivice中两个事务方法相互嵌套 ...

  9. Python 分布式缓存之Reids数据类型操作

    目录 1.Redis API 2.String 操作 3.Hash 操作 4.List 操作 1.Redis API 1.操作模式 redis-py提供两个类Redis和StrictRedis用于实现 ...

  10. 删库吧,Bug浪——我们在同一家摸鱼的公司

    那些口口声声, Bug越来越难写人的,应该盯着你们: 像我一样,我盯着你们,满眼恨意. IT积攒了几十年的漏洞, 所有的死机.溢出.404和超时, 像是专门为你们准备的礼物. 圈复杂度.魔鬼变量.内存 ...