美文网首页
Flask解析(一)路由

Flask解析(一)路由

作者: 随风而去_c0e8 | 来源:发表于2019-01-16 15:19 被阅读0次

    flask 简介:

    • Flask是Python一个Web框架
    • Flask 官网上对它的定位是一个“微” python web 开发框架。
    • Flask以简,小而出名。

    废话不多说,A minimal Flask application looks something like this:

    from flask import Flask
    app = Flask(__name__)#初始化实例
    
    @app.route('/')#路由装饰器
    def hello_world():
        return 'Hello, World!'
    
    if __name__=='__main__':
        app.run() #运行服务器
    

    好了,一个小型的服务器就完成了,是不是很简单呢!


    image

    只要在浏览器上输入:localhost:5000或者http://127.0.0.1:5000/效果都是一样的

    效果图

    flask 有两个核心依赖库

    • werkzeug 和 jinja,而 werkzeug 又是两者中更核心的。
    • werkzeug 负责核心的逻辑模块,比如路由、请求和应答的封装、WSGI 相关的函数等(也是Flask作者开发的,难怪了,大佬只有膜拜的份,[捂脸表情])
    • jinja 负责模板的渲染,主要用来渲染返回给用户的 html 文件内容

    看了源码后,感觉Flask只是在werkzeug 的基础上的二次封装。有兴趣的可以看看源码

    要理解 flask 的源码,必须有一定的 python 基础(一个必须理解的概念是 WSGI

    NOTE:本系列文章分析的 flask 版本号是 1.0.2,其他版本可能会有出入。

    在讲Flask源码之前先简单介绍一下werkzeug

    werkzeug

    werkzeug 的定位并不是一个 web 框架,而是 HTTP 和 WSGI 相关的工具集,可以用来编写 web 框架,也可以直接使用它提供的一些帮助函数。

    Werkzeug is an HTTP and WSGI utility library for Python.

    werkzeug 提供了 python web WSGI 开发相关的功能:

    • 路由处理:怎么根据请求中的 url 找到它的处理函数
    • request 和 response 封装:可以更好地读取 request 的数据,也容易生成响应
    • 一个自带的 WSGI server,可以用来测试环境运行自己的应用

    比如,我们可以使用 werkzeug 编写一个简单的 hello world 的 WSGI app:

    from werkzeug.wrappers import Request, Response
    
    @Request.application
    def application(request):
        return Response('Hello World!')
    
    if __name__ == '__main__':
        from werkzeug.serving import run_simple
        run_simple('localhost', 4000, application)
    

    回到Flask源码

    短短几行代码,Flask到底做了什么了呢?我们继续看下去
    app = Flask(name) 主要做的是路径处理和初始化属性,里面很复杂就不细讲了
    @app.route('/') Flask的路由装饰器,对add_url_rule进行封装

    route源码
    接着我们再看add_url_rule,由于代码颇多,我就截取核心代码来参考
    def add_url_rule(self, rule, endpoint=None, view_func=None, **options):
        """Connects a URL rule.  Works exactly like the :meth:`route`
        decorator.  If a view_func is provided it will be registered with the
        endpoint.
        """
    
        methods = options.pop('methods', None)
    
        rule = self.url_rule_class(rule, methods=methods, **options)
        self.url_map.add(rule)
        if view_func is not None:
            old_func = self.view_functions.get(endpoint)
            if old_func is not None and old_func != view_func:
                raise AssertionError('View function mapping is overwriting an '
                                     'existing endpoint function: %s' % endpoint)
            self.view_functions[endpoint] = view_func
    
    • self.url_rule_class 实际就是werkzeug.routing:Rule类的对象
    • self.url_map 实际就是werkzeug.routeing:Map类的对象
    • view_functions 就是一个字典

    简单的来说add_url_rule就是将路径rule与试图函数view_func进行映射
    需要注意的是:每个视图函数的 endpoint 必须是不同的,否则会报 AssertionError。

    要想真正理解其中的操作还需要回到werkzeug.routing看 Map, Rule类的实现,今天先讲到这了,下一章将详细讲解werkzeug.routing里 Map, Rule

    相关文章

      网友评论

          本文标题:Flask解析(一)路由

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