flask源码笔记(1) 依赖包

作者: kuulid | 来源:发表于2017-10-05 18:20 被阅读101次

    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。

    相关文章

      网友评论

        本文标题:flask源码笔记(1) 依赖包

        本文链接:https://www.haomeiwen.com/subject/vbdkyxtx.html