Flask路由原理

概述

本文讲解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 和 视图函数 进行绑定:

  1. 将 URL 与 endpoint(默认是视图函数名) 进行绑定,放入到 Flask类的url_map 成员变量中
  2. 将 endpoint(默认是视图函数名) 将 视图函数 进行绑定,放入到 Flask类vuew_functions 成员变量中

浏览器访问时

  1. 当浏览器访问 URL 时,首先将 URL 与 url_map 进行匹配查找,找出对应 endpoint
  2. 然后将 endpoint 与 vuew_functions进行匹配查找,找出对应的 视图函数
  3. 然后将请求交给该 视图函数 执行

查看所有路由

在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>])
--------------------------------------------------

解释:
这里有两个路由:

  1. <Rule '/' (OPTIONS, GET, HEAD) -> index>,是我们自己定义的,对应的 endpoint 是 index (没有指定endpoint,其默认值是 视图函数名)
    支持请求方法有:OPTIONS, GET, HEAD

  2. <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>}

解释:
这里有两个视图函数,

  1. key 是static的(也就是说 endpoint 是 static),value是send_static_file()函数。
    当访问静态文件时,即:访问URL HTTP://ip:port/static/文件名 时,将请求交给send_static_file()函数 处理

  2. key 是index的(也就是说 endpoint 是 index),value是我们定义的index() 函数。
    当访问URL HTTP://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)

原文出处:/show_1EF3U5Y2pOJc.html