flask源码笔记(1) 依赖包

96
kuulid
2017.10.05 18:20* 字数 740

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。

techNote
Web note ad 1