zoukankan      html  css  js  c++  java
  • flask0.1版源码浅析——url分配处理

    1 application 启动(匹配路由)

    1.1 首先我们需要了解wsgi的概念:

    每个 python web 应用都是一个可调用(callable)的对象。在 flask 中,这个对象就是 app=Flask(__name__) 创建出来的app,也就是 Application 部分。要运行 web 应用,必须有 web server,比如像服务器有的 apache、nginx 。

    1.2 server和app之间通过 app(environ, start_response)进行通信,

    1.3 正式启动 app.run()

      ---> run_simple(...,self,...)

         ---> Flask()的__call__  

          ---> wsgi_app(environ, start_response)

            ----> dispatch_request

    1.3.1 然后我们来看一下dispath_request 方法match路由

        def dispatch_request(self):
            # ...
            try:
                endpoint, values = self.match_request()
                return self.view_functions[endpoint](**values)
           except:
              # 异常处理
                pass

    这个方法主要进行了请求匹配,match出相应的view_function,返回这个view_function

    1.3.2 所以接下来我们看一下match_request方法

        def match_request(self):
            rv = _request_ctx_stack.top.url_adapter.match()
            request.endpoint, request.view_args = rv
            return rv

    这个方法是先从_request_ctx_stack总取出相应了request_context,然后根据自定义容器Map找到对应的url的endpoint和相关参数,最后返回。

    2 路由(注册路由)

    2.1 首先我们通过 app.route(self, rule, **options) 可知

    def route(self, rule, **options):
        # ...
        def decorator(f):
            self.add_url_rule(rule, f.__name__, **options)
            self.view_functions[f.__name__] = f
            return f
        return decorator

    2.1.1 这个方法运用了装饰器,所以flask的应用会很简洁。

    并且他的这个装饰器和常见的装饰器定义有所不同,他是对象调用方法的方式创建装饰器.

    self.route(decortate(f))

    首先会进行路由注册,然后返回自身的这个view_function

    我们在看里面调用的方法

    2.1.2  add_url_rule(self, rule, endpoint=None, view_func=None, **options)  来进行注册路由

        def add_url_rule(self, rule, endpoint, **options):
            options['endpoint'] = endpoint
            options.setdefault('methods', ('GET',))
            self.url_map.add(Rule(rule, **options))

    这个方法就是向url_map中添加路由, 默认的endpoint就是传入的func.__name__; 然后默认的methods就是‘GET', 最后进行一次Rule包装就可以添加了。

  • 相关阅读:
    echarts使用
    Nutch插件系统
    linux命令总结
    linux命令行快捷键
    每日一笔
    Hadoop参数调优
    rsync用于同步目录
    hadoop遇到的问题(汇总)
    linux历史命令
    hadoop 编译代码及运行
  • 原文地址:https://www.cnblogs.com/fuzzier/p/7489121.html
Copyright © 2011-2022 走看看