flask源码笔记(1) 依赖包
github地址:包括所有实例的代码 https://github.com/kurset/learn_flask_code
不定期更新。
依赖
virtualenv venv创建虚拟环境后,pip install flask安装flask包,之后
pip freeze > requirments.txt,我们看看flask都自动安装了哪些东西:
click==6.7
Flask==0.12.2
itsdangerous==0.24
Jinja2==2.9.6
MarkupSafe==1.0
Werkzeug==0.12.2
click https://github.com/pallets/click 处理命令行工具
itsdangerous https://github.com/pallets/itsdangerous 加密工具
jianja2 https://github.com/pallets/jinja flask的template模板引擎
MarkupSafe https://github.com/pallets/markupsafe 也是用在模板里的,用来安全的转义模板
Werkzeug
剩下的就是一个比较重要的一个依赖 Werkzeug
中文文档如下:http://werkzeug-docs-cn.readthedocs.io/zh_CN/latest/index.html
Werkzeug并不是一个框架,它是一个 WSGI 工具集的库。
Werkzeug 提供了 python web WSGI 开发相关的功能:
- 路由处理:怎么根据请求中的 url 找到它的处理函数
- request 和 response 封装:可以更好地读取 request 的数据,也容易生成响应
- 一个自带的 WSGI server,可以用来测试环境运行自己的应用
什么是wsgi
wsgi总的来说是一个定义于python应用程序和web服务器直接的一个协议,通过这个协议,python webapp可以将http底层一些杂活交给服务器处理,自己仅仅去接受和返回数据就可以了。
运用Werkzeug提供的一些工具,简单的wsgi应用程序如下:
from werkzeug.wrappers import Response, Request
def application(environ, start_response):
request = Request(environ)
text = 'hello world'
response = Response(text, mimetype='text/plain')
return response(environ, start_response)
其中environ是请求HTTP的所有信息,而start_response是发送HTTP响应的函数,我们填写好请求,然后返回出去,由web服务器处理之后的一些杂活(TCP连接什么的底层网络行为)。
实验一下flask的wsgi函数
我们在flask包中找到app.py文件。
其中有个wsgi_app函数,定义如下:
def wsgi_app(self, environ, start_response):
ctx = self.request_context(environ)
ctx.push()
error = None
try:
try:
response = self.full_dispatch_request()
except Exception as e:
error = e
response = self.handle_exception(e)
except:
error = sys.exc_info()[1]
raise
return response(environ, start_response)
finally:
if self.should_ignore_error(error):
error = None
ctx.auto_pop(error)
这个函数就是flask的wsgi函数,我们强行改写一下函数(实验目的):定义如下,然后写最简单的flask应用启动
def wsgi_app(self, environ, start_response):
text = 'change wsgi response'
response = Response(text, mimetype='text/plain')
return response(environ, start_response)
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'flask app'
if __name__ == '__main__':
app.run()
启动服务,游览器访问,我们发现,不管flask程序怎么写, 都是返回change wsgi response字符,原因是中途的返回值在flask交给wsgi的过程中被“劫持了”。
flask是什么
可以看到flask更像是一个连接各个方面的“桥梁”,需要处理数据库,它需要ORM。处理好了,生成html模板,它又借助�Jinja2,又或者生成json数据接口,需要借助flask-restful。返回数据处理好了,flask再通过wsgi协议交给服务器,然后服务器又像跑腿的伙计一样包装送给用户,又把用户的请求包装起来送回给flask。