通过werkzeug了解wsgi
Django有wsgi当做socket,而flask自身是没有wsgi的,他是通过werkzeug来实现的.
看源码
下面看下源码是如何实现的:
#这是我们写的flask代码
from flask import Flask app = Flask(__name__) #先实例化对象 @app.route('/index') #将/index路径和index函数名做了映射(对应关系)然后放到flask里面去
def index():
return 'hello world' if __name__ == '__main__':
app.run() #从app.run()启动项目
点击(ctrl+左键,后文的点击全是这样的)run进到源码,这里的self就是app(app就是Flask实例化的对象)

往下走,找到

点击run_simple进入到源码,这个run_simple其实就是werkzeug的代码了,进来之后,flask项目就hang住了,等待请求的进来.

注意,run_simple封装的内容中 hostname(主机名/IP地址),port(端口),application(函数名)是必须写的
werkzeug模拟flask
代码我们现在只能写:
from werkzeug.serving import run_simple def func(environ,start_response): #我们需要知道视图函数的返回值是啥,才能进一步写代码
print('请求来了') if __name__ == '__main__':
run_simple('127.0.0.1',5000,func) #这里括号的内容上面源码有解释,func是个函数名,当请求来时会自动执行第三个参数+(),也就是执行func函数func(),然后就跳到上面去执行func函数了
继续看flask代码:
from flask import Flask
app = Flask(__name__) #先实例化对象
@app.route('/index') #将/index路径和index函数名做了映射(对应关系)然后放到flask里面去
def index():
return 'hello world'
if __name__ == '__main__':
app.run() #从app.run()启动项目
app.__call__ #因为对象+()就会执行类的__call__方法,所以我们从Flask的__call__方法进入源码
点击call进入Flask源码

我们已经进入到Flask源码了,再点击wsgi_app

其实wsgi_app就在call上面,而它的返回值response(environ, start_response)其实就是要返回给用户的,就是我们要找的视图函数的返回值.

response就是上面2449行得到的
点full_dispatch_request进去

这里rv我门就不深推了,他其实就是视图函数返回的字符串.
返回时对rv做了处理,我们点finalize_request进去

这里最后的response就是整个视图函数的返回值,点make_response进去

经过一系列判断,这里最后就返回了rv,rv就是整个视图函数的返回值.
我们需要再看下2106行对rv的判断

再看下response_class

也就是说判断一下rv是不是Response的对象,
再往下走,rv是字符串,不是Response的对象,

这里就判断rv是不是字符串,rv是字符串再往下

这里你需要结合前面的过程来看:
这里就相当于是: rv = Response(rv, status=status, headers=headers),是个对象,rv是视图函数返回的字符串,需要传进去.而rv正好是make_response的返回值,而self.make_response他返回给了response.
所以response=Response(rv, status=status, headers=headers),而rv就是视图函数返回的字符串,后面的参数()status=status, headers=headers)可以不写,所以 response=Response("hello world")
rv这个字符串就被封装到rv这个Response的对象里面去了.

咱们再找response_class,点进去,找到Response

这里我们把鼠标放到标签上,看下当前Response所在的位置(路径)

此时我们的代码可以改为:
from werkzeug.serving import run_simple
from flask.wrappers import Response #新加的 def func(environ,start_response):
print("请求来了")
response=Response("hello world")
return response(environ,start_response) #新加的 if __name__ == '__main__':
run_simple('127.0.0.1',5000,func)
但是还是有点不严谨,因为你引用的模块是flask的,我们前面说了,werkzeug不需要flask,而是werkzeug为flask提供socket功能.
因为Response继承了ResponseBase,所以点进去看

这里,我们看到了在werkzzeug下的Response继承了BaseResponse,

我们再向上看,上面的import已经把BaseResponse给引过来了

所以我们可以在原来的代码上写from werkzeug.wrappers import BaseResponse,或者我们再点进 BaseResponse看他从哪来

我们看下wrappers的init文件写啥:

这里是吧BaseResponse引到wrappers文件的init文件中了,你只要引入wrappers文件就可以倒入BaseResponse这个类了
所以from werkzeug.wrappers.response import BaseResponse 或者是from werkzeug.wrappers.base_response import BaseResponse
再或者from werkzeug.wrappers import BaseResponse都可以引入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)
所以咱们可以不依赖flask只用werkzeug也可以实现搭建网站的功能.
通过werkzeug了解wsgi的更多相关文章
- 如何使用werkzeug创建WSGI APP
注意 : 1.定义__call__的意义 class App(): def __init__(self): pass def method(self): pass app=App() app() #错 ...
- Werkzeug工具包学习-官方例子Shortly分析
为了学习werkzeug的wsgi框架工具,今天真对官网的例子进行调试运行.涉及到了werkzeug工具包,jinja2前端模版,以及redis内存库,之后可以灵活定制自己主页.再次,作以记录. 首先 ...
- [转载]Python 资源大全
原文链接:Python 资源大全 环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具. pyenv – 简单的 Python 版本管理工具. Vex ...
- python常用库
本文由 伯乐在线 - 艾凌风 翻译,Namco 校稿.未经许可,禁止转载!英文出处:vinta.欢迎加入翻译组. Awesome Python ,这又是一个 Awesome XXX 系列的资源整理,由 ...
- Python框架、库以及软件资源汇总
转自:http://developer.51cto.com/art/201507/483510.htm 很多来自世界各地的程序员不求回报的写代码为别人造轮子.贡献代码.开发框架.开放源代码使得分散在世 ...
- Flask微型框架入门笔记
例程: from flask import Flask app = Flask(__name__) # 新建一个Flask可运行实体(名字参数如果是单独应用可以使用__name__变量,如果是modu ...
- Awesome Python
Awesome Python A curated list of awesome Python frameworks, libraries, software and resources. Insp ...
- Machine and Deep Learning with Python
Machine and Deep Learning with Python Education Tutorials and courses Supervised learning superstiti ...
- Python 库大全
作者:Lingfeng Ai链接:http://www.zhihu.com/question/24590883/answer/92420471来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非 ...
随机推荐
- C# 全角半角字符互转
/// <summary> /// 全角空格为12288,半角空格为32 /// 其他字符半角(33-126)与全角(65281-65374)的对应关系是:均相差65248 /// < ...
- access us
Ubuntu下设置 chrome的SwitchyOmega Wiki (简体中文)wiki Linux安装配置客户端及开机自动启动 运维 安装 配置 搭建服务以及配置多用户 安装和配置 一键搭建 服务 ...
- ffmpeg结合SDL编写播放器(一)
ffmpeg 工具是一个高效快速的命令行工具,进行视音频不同格式之间的转换. ffmpeg命令行 ffmpeg可以读取任意数量的输入“文件”(可以是常规文件,管道,网络流,抓取设备等)读取,由 -i ...
- Instance Segmentation with Mask R-CNN and TensorFlow
Back in November, we open-sourced our implementation of Mask R-CNN, and since then it’s been forked ...
- <每日 1 OJ> -LeetCode 13 . 罗马数字转正数
题目: 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1 ...
- 面试官问我:平常如何对你的 Java 程序进行调优?
阅读本文大概需要 10 分钟. 作者:张俊城, 郭理勇, 刘建来源:http://t.cn/AiCTERJz Java 应用性能优化是一个老生常谈的话题,典型的性能问题如页面响应慢.接口超时,服务器负 ...
- JavaScript初探系列(八)——DOM
DOM(文档对象模型)是针对HTML和XML文档的一个API,描绘了一个层次化的节点树,允许开发人员添加.删除和修改页面的某一部分. HTML DOM 树形结构如下: 一.Node方面 (一).节点类 ...
- webssocket简介-服务器可以主动传送数据给浏览器
WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据.在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并 ...
- 【深入学习linux】CentOS 7 最小化安装后的注意事项及一些必备组件的安装
转载:https://blog.csdn.net/F_Srion/article/details/54910943 在VM虚拟机中安装CentOS 7 时 有时候顾虑到电脑硬件性能,我们需要最小化安装 ...
- 【用例篇】Xmind转为csv 导入禅道
用过禅道的都知道,用例维护实在是太不方便了,有人推荐了一种方法,用Xmind先编写用例(思路比较清晰),写好之后借助工具(xmind2testcase)将用例转为CSV格式,之后再导入禅道 参考资料: ...