概述
本文讲解Flask路由实现原理
见下面的代码
# coding=utf-8
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello, World!'
if __name__ == "__main__":
app.run(debug=True)
解释:
在上面的代码中@app.route('/')表示将 URL根路径 和 index()函数 进行绑定
注意:
路由中的 url 必须从/开始,如果写成@app.route(''),会报下面错误:
ValueError: urls must start with a leading slash
实现原理
启动时
启动Flask应用时,会根据装饰器,将 URL 和 视图函数 进行绑定:
- 将 URL 与 endpoint(默认是视图函数名) 进行绑定,放入到 Flask类的
url_map成员变量中 - 将 endpoint(默认是视图函数名) 将 视图函数 进行绑定,放入到 Flask类
vuew_functions成员变量中
浏览器访问时
- 当浏览器访问 URL 时,首先将 URL 与
url_map进行匹配查找,找出对应 endpoint - 然后将 endpoint 与
vuew_functions进行匹配查找,找出对应的 视图函数 - 然后将请求交给该 视图函数 执行
查看所有路由
在Flask类中有url_map成员变量,该变量保存所有的路由信息
# coding=utf-8
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello, World!'
if __name__ == "__main__":
print('-'*50)
print(app.url_map)
print('-'*50)
app.run(debug=True)
执行后打印结果如下:
--------------------------------------------------
Map([<Rule '/' (OPTIONS, GET, HEAD) -> index>,
<Rule '/static/<filename>' (OPTIONS, GET, HEAD) -> static>])
--------------------------------------------------
解释:
这里有两个路由:
<Rule '/' (OPTIONS, GET, HEAD) -> index>,是我们自己定义的,对应的 endpoint 是 index (没有指定endpoint,其默认值是 视图函数名)
支持请求方法有:OPTIONS, GET, HEAD<Rule '/static/<filename>' (OPTIONS, GET, HEAD) -> static>,是系统默认添加的,对应的 endpoint 是 static
支持请求方法有:OPTIONS, GET, HEAD,不支持POST
查看所有的视图函数
在Flask类中有view_functions成员变量,dict类型,key是 endpoint,value是函数
# coding=utf-8
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello, World!'
if __name__ == "__main__":
print('-'*50)
print(app.view_functions)
print('-'*50)
app.run(debug=True)
执行后打印结果如下:
{'static': <bound method _PackageBoundObject.send_static_file of <Flask '1'>>, 'index': <function index at 0x038E0540>}
解释:
这里有两个视图函数,
key 是static的(也就是说 endpoint 是 static),value是
send_static_file()函数。
当访问静态文件时,即:访问URLHTTP://ip:port/static/文件名时,将请求交给send_static_file()函数 处理key 是index的(也就是说 endpoint 是 index),value是我们定义的
index()函数。
当访问URLHTTP://ip:port时,将请求交给index()函数 处理
装饰器路由高级
设置路由时指定endpoint
# coding=utf-8
from flask import Flask
app = Flask(__name__)
@app.route('/',endpoint='test')
def index():
return 'Hello, World!'
if __name__ == "__main__":
print('-'*50)
print(app.url_map)
print('-'*50)
print(app.view_functions)
print('-'*50)
app.run(debug=True)
打印结果如下:
Map([<Rule '/' (HEAD, GET, OPTIONS) -> test>,
<Rule '/static/<filename>' (HEAD, GET, OPTIONS) -> static>])
--------------------------------------------------
{'static': <bound method _PackageBoundObject.send_static_file of <Flask '2'>>, 'test': <function hello at 0x02BE1858>}
url / 对应的 endpoint 是 test
装饰器路由的实现原理
装饰器@app.route('/')是调用Flask类的
add_url_rule(rule, endpoint=None, view_func=None, **options)
方法实现的
通过add_url_rule()方法实现路由
调用Flask类的
add_url_rule(rule, endpoint=None, view_func=None, **options)
方法实现,如下代码:
def index():
return 'Hello, World!'
app.add_url_rule('/',view_func=index)
解释:
将 URL根路径 和 index()函数 进行绑定
指定endpoint
app.add_url_rule('/','index',index)
