flask路由系统源码分析

路由系统

复制代码
源码分析:
    app = Flask(__name__)
    1.在创建app对象的时候,将很多有用的信息都封装到对象里面了。可以点击去Flask()里面去查看
    
    @app.route('/index')
    def index():
        return "index"
    2.在执行这段的时候,会将路由(url)和视图函数创建对应关系,存放到app的一个对象(map对象里面)里面。如果有多个url和视图的对应关系,
      会将这多个对应关系都封装到app的对象里面。
      注意:
        2.1 在执行带参数的装饰器的时候,先执行的是@app.route('/index'),会返回一个函数,比如是f,
            然后再将index传到f里面,f返回的是什么,index的返回值就是什么
2.2 所以先执行route()函数,其返回了一个decorator的函数名
2.3 在继续执行的时候,将index传递到decorator里面,相当于是一个闭包,其实也等价于 @decorator def index(): return "index"
2.4 在执行decorator的时候,会去取值endpoint,如果没有,就默认为None。 也会执行self.add_url_rule(rule, endpoint, f, **options) 其中rule是url,endpoint就是函数的endpoint,f就是被装饰的函数index,并且将endpoint赋值给options
2.5 add_url_rule()方法首先会判断endpoint是否为空,为空的话,就将被装饰的函数名赋值给endpoint
2.6 add_url_rule里面会去执行一个rule = self.url_rule_class(rule, methods=methods, **options)类,创建了一个rule的对象, 其中里面的rule就是传递过来的url也就是/index,methods就是能被url执行的请求方式的列表 url_rule_class()这一步做的就是将url和methods,以及options打包做成了一个rule对象,其中optinos就是endpoint
       所以rule里面只有url和endpoint的映射关系
2.7 然后执行self.url_map.add(rule)将rule对象加入到map对象里面,说白了map对象有好多的ruel的规则,rule的里面有好多url和endponit的对应关系
2.8 继续执行add_url_rule方法,执行了
self.view_functions[endpoint] = view_func,将函数和endpoint的映射关系存放到view_functions字典里面

     2.9 add_url_rule做的是:
         a.将url和endpoint的对应关系以及methods封装成rule对象,将rule对象封装成map对象,赋值给self.url_map对象里面
         b.将endponit和函数的对应关系,放到self.view_functions字典里面。
     2.10 在意有一个index的情况下,self.url_map 和self.views_functions都有两条记录,一个是index,一个是static模板的路由

    所以当请求进来时,使用url在slef.url_map里一次匹配,返回匹配成功的endpoint,在通过endpoint去self.view_functions里面找到endpoint和函数的对应关系,从而具体要执行的函数找到
    执行并返回

复制代码

编写路由

复制代码
所以视图函数也可以这样写,也可以添加路由关系
        from flask  import Flask,request,render_template
        app = Flask(__name__)

        @app.before_request
        def f1():
            print('befor')

        # @app.route('/index')
        def index():
            print('123')
            return "456"
        app.add_url_rule('/index','index',index)
        #add_url_rule(rule, endpoint, f, **options)
        # 第一个/index是url,第二个是endpoint,第三个是函数名
        if __name__ == '__main__':
            app.run(
                host='127.0.0.1',
                port='12122'
            )
  
动态路由:
    @app.route('/login')
    def login():
        return render_template('login.html')
        
    @app.route('/login/<name>')
    def login(name):
        print(type(name))
        return render_template('login.html')
        
    @app.route('/login/<int:name>')
    def login(name):
        print(type(name))
        return render_template('login.html')
        
支持正则表达式的路由
    from flask import Flask,render_template

    app = Flask(__name__)


    from werkzeug.routing import BaseConverter
    class RegConverter(BaseConverter):
        def __init__(self, map, regex):
            super().__init__(map)
            self.regex = regex
    app.url_map.converters['regex'] = RegConverter

    @app.route('/index/<regex("\d+"):x1>')
    def index(x1):
        return render_template('index.html')

    if __name__ == '__main__':
        app.run()
复制代码

 

 

 

pass

posted @   thep0st  阅读(65)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
点击右上角即可分享
微信分享提示