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
上帝说要有光,于是便有了光;上帝说要有女人,于是便有了女人!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .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技术实操系列(六):基于图像分类模型对图像进行分类