Werkzeug is an HTTP and WSGI utility library for Python.提供:

1.WSGI server 类似于tomcat,是一个server 容器
2.对requestresponse的封装
3.路由处理,将url和func联系起来

所有的python web都要遵循WSGI协议,每个python web都是一个callable对象,就像app = Flask(__name__)创建出来的app一样.下图中
client就是我们的浏览器,比如chrome,edge,firefox等
server就是apache,nginx,tomcat,和我们要讲的wekzug.WSGIServer
application就是springmvc,springboot,或者flask

WSGI规定了ServerApplication通信的规范,比如app(environ,start_response)接口,Server会调用Application,并传递environ(请求的所有信息),和start_response(Application处理完需要调用的函数,参数是状态码,响应头等)

1.从flask讲起,这里用的是最初的版本(v0.0.1).

from flask import Flask
app = Flask(__name__)@app.route('/')
def hello_world():return 'Hello, World!'if __name__ == '__main__':app.run()

2.app.run()是入口,查找run方法

def run(self, host='localhost', port=5000, **options):from werkzeug import run_simpleif 'debug' in options:self.debug = options.pop('debug')options.setdefault('use_reloader', self.debug)options.setdefault('use_debugger', self.debug)return run_simple(host, port, self, **options) # self 就是Flask(__name__)自身

3.run_simple就是监听指定port,收到HTTP时解析为WSGI格式,然后调用app来处理逻辑
WSGI要给app传入environstart_response两个参数,所以要找app__call__

def __call__(self, environ, start_response):"""Shortcut for :attr:`wsgi_app`"""return self.wsgi_app(environ, start_response)

4.可以看到__call__返回的是调用self.wsgi_app,之所以没把self.wsgi_app内容写在__call__中,是因为以后添加中间件方便,
例如app.wsgi_app = MyMiddleware(app.wsgi_app)

def wsgi_app(self, environ, start_response):with self.request_context(environ):rv = self.preprocess_request()if rv is None:rv = self.dispatch_request()response = self.make_response(rv)response = self.process_response(response)return response(environ, start_response)

5.首先看self.request_context

def request_context(self, environ):return _RequestContext(self, environ)

直接调用的是_RequestContext(self, environ)

class _RequestContext(object):def __init__(self, app, environ):self.app = appself.url_adapter = app.url_map.bind_to_environ(environ)self.request = app.request_class(environ)self.session = app.open_session(self.request)self.g = _RequestGlobals()self.flashes = Nonedef __enter__(self):_request_ctx_stack.push(self)def __exit__(self, exc_type, exc_value, tb):if tb is None or not self.app.debug:_request_ctx_stack.pop()

就是用来存储上下文的,必须用with打开

所以:self.request_context主要是利用stack保证在一个线程里处理这个请求

6.接着看preprocess_request

def preprocess_request(self):for func in self.before_request_funcs:rv = func()if rv is not None:return rv

对请求先进行预处理

7.dispatch_requestrequest进行分发处理

    def dispatch_request(self):try:endpoint, values = self.match_request()return self.view_functions[endpoint](**values)except HTTPException, e:handler = self.error_handlers.get(e.code)if handler is None:return ereturn handler(e)except Exception, e:handler = self.error_handlers.get(500)if self.debug or handler is None:raisereturn handler(e)

返回处理函数的处理结果,就是在flask里写的

@app.route('/')
def hello_world():return 'Hello, World!'

8.self.make_response 将结果封装成response,有的在上一步中已经封装了

def make_response(self, rv):if isinstance(rv, self.response_class):return rvif isinstance(rv, basestring):return self.response_class(rv)if isinstance(rv, tuple):return self.response_class(*rv)return self.response_class.force_type(rv, request.environ)

9.process_response(self, response)对response进行最后一步处理

def process_response(self, response):session = _request_ctx_stack.top.sessionif session is not None:self.save_session(session, response)for handler in self.after_request_funcs:response = handler(response)return response

参考:
https://cizixs.com/2017/01/11/flask-insight-start-process/
https://www.toptal.com/python/pythons-wsgi-server-application-interface

flask v0.1 内部运行程序相关推荐

  1. Android Studio Terminal 不是内部或外部命令,也不是可运行程序或批处理文件

    版权声明:本文为博主原创文章,未经我的允许不得转载! 转载请标明出处: http://blog.csdn.net/guiying712/article/details/53129961 ,本文出自:[ ...

  2. '无法将“vue”项识别为 cmdlet、函数、脚本文件或可运行程序的名称' 或 'vue不是内部或外部命令' 的解决方法...

    如果在使用 vue 初始化项目的时候提示: vue : 无法将"vue"项识别为 cmdlet.函数.脚本文件或可运行程序的名称.请检查名称的拼写,如果包括路径,请确保路径正确,然 ...

  3. VC++的学习(基于VS2008)——windows程序内部运行机制

    昨天和今天都在学习windows程序的内部运行机制,再次学习这一章,我明显感到条理清晰了,原来这一章是讲我们所用的电脑,这样一个windows平台下程序运行的内部机制的.windows应用程序下最重要 ...

  4. 解决umi 不是内部或外部命令,也不是可运行程序问题

    一 UmiJS安装 安装Node.js,使用node -v命令检测安装结果 安装yarn,其中tyarn使用的是npm.tao.bao.org的源,速度比较快,其实可以将yarn看作为优化后的npm ...

  5. 说说在CMD命令行模式下ADB命令显示为不是内部或外部命令,亦不是可运行程序和批处理文件的解决办法

    有时候在android开发中我们会用到adb命令行,但很多人在cmd中输入adb命令后,会出现'adb'不是内部或外部命令,亦不是可运行程序和批处理文件的问题 解决办法是:找到SDK目录,在其子目录p ...

  6. 在CMD中输入adb命令,提示“‘adb‘ 不是内部或外部命令,也不是可运行程序或批处理文件”的解决方法

    在android开发中有时我们会用到adb命令行,但很多人在cmd中输入adb命令后,会出现'adb'不是内部或外部命令,也不是可运行程序或批处理文件的问题,如图 解决步骤如下: 打开AndroidS ...

  7. 已配置好环境,在CMD中输入adb命令,还是提示“‘adb‘ 不是内部或外部命令,也不是可运行程序或批处理文件”的解决方法

    前提:win10环境,已在系统变量中配置好ANDROID_HOME,且确认无误,cmd输入adb命令,还是提示"'adb' 不是内部或外部命令,也不是可运行程序或批处理文件" 百度 ...

  8. Pepper/Nao中级教程:第二章 如何将Python程序部署到机器人内部运行

    关于Naoqi之家 欢迎访问Naoqi之家,一个提供Pepper/Nao机器人中文开发手册的站点. http://www.naoqi.net 2.1 目标 写好的机器人程序,我们当然要脱离个人电脑,把 ...

  9. 孙鑫VC++LESSON1:Windows程序内部运行原理

    视频链接:https://www.bilibili.com/video/BV1Ts411f7fw/?spm_id_from=333.337.search-card.all.click&vd_s ...

最新文章

  1. 百度地图轨迹开发,如何绘制带有箭头的折线
  2. linux下创建具有root权限的账户
  3. 数据库的几种联结,union,union all ,inner jion ,left jion,right jion ,cross jion
  4. c语言是以文件为单位编译,c语言从头开始(三:编译器工作原理) (我们还可以自己编写头文件后缀是xx.h并把它当前代码文件所在目录我们要用就可以直接通过下面代码使用)...
  5. Python学习系列day1-python基础
  6. mysql 5.7.14编译安装_源码编译安装mysql-5.7.14-阿里云开发者社区
  7. 操作系统第二章-进程的描述与控制
  8. 孙三奇 计算机科学,墓徒暗战-第二百零八章 惨烈的变故
  9. Rolling cURL: PHP并发最佳实践
  10. r语言 精美rda图_R语言动态图可视化:如何、创建具有精美动画的图
  11. Basic serial port listening application
  12. leaflet自定标签json_Windows Terminal更新后,自定义配置失效?快捷键无法使用?
  13. 通信协议规格_小米和阿里巴巴定义智能家居通信协议“蓝牙Mesh”
  14. @Python 开发者,如何更加高效地编写代码?
  15. Python利用shelve模块设计简单数据库程序
  16. h5课件制作_用H5做课件的好处,你知道多少?
  17. SpringBoot中的配置文件详解(yml、properties全局配置和自定义配置、@ConfigurationProperties与@Vuale使用、有趣的banner图配置)
  18. 10个web开发好用框架
  19. pta新浪微博热门话题
  20. KGB知识图谱能够为公司分析上市影响因素

热门文章

  1. 使用window自带的截图工具
  2. clion导入mysql库_CLion如何添加依赖库 ? 需要把mysql/Connector c++放入 用cpp连接数据库...
  3. JavaScript之jQuery够用即可(事件委托、动画效果、扩展插件)
  4. 1、数列求值 - 2019年第十届蓝桥杯大赛软件类省赛
  5. Python+OpenGL进行立方体多纹理映射
  6. java8 stringbuilder_有了Java8的“+”真的可以不要StringBuilder了吗
  7. java arraylist线程安全_面试题1:ArrayList 是线程安全的吗?如果要实现一个线程安全的List应该怎么做?...
  8. html里content标签作用,HTML content 标签
  9. python 字符串数组_python用法笔记(数组(list、touple、dict)、字符串)
  10. java 随机化快速排序,JS实现随机化快速排序的实例代码