Flask端点概念

Flask要点理解

路由端点

通常,我们使用app.route()装饰器将视图函数注册为路由。如果不使用该装饰器,也可以采用app.add_url_rule(rule, endpoint, view_func)方法注册路由。如下:

app = Flask(__name__)

# 方法一
@app.route('/hello')
def greet():
    return 'Hello.'

# 方法二
def greet():
    return 'Hello.'
app.add_url_rule('/hello', 'greet', 'greet')

URL规则和视图函数之间是通过端点来映射的(默认情况下端点是视图函数的名称),即
/hello(URL规则)-->greet(端点)-->greet(视图函数)

对于上面的方法一,我们也可以显示的使用endpoint参数来改变端点,而不是默认使用视图函数的名称,如下:

@app.route('/hello', endpoint='hello')
def greet():
    return 'Hello.'

这时映射规则变成这样,/hello(URL规则)-->hello(端点)-->greet(视图函数)


:为什么引入端点的概念?
:使用端点可以实现蓝本的视图函数命名空间。

我们分别在蓝本A和蓝本B中创建一个名为index的视图函数,并将这两个蓝本注册到程序实例上,如下:

# project/app_package/blueprints_package/blueprint_A.py
from flask import Blueprint

a_bp = Blueprint('A', __name__)

@blog_bp.route('/')
def index():
    return 'index'

# project/app_package/blueprints_package/blueprint_B.py
from flask import Blueprint

b_bp = Blueprint('B', __name__)

@blog_bp.route('/')
def index():
    return 'index'

# project/app_package/__init__.py
from flask import Flask
from app_package.blueprints_package.blueprint_A import a_bp
from app_package.blueprints_package.blueprint_B import b_bp

app = Flask('app_package')
app.register_blueprint(a_bp, url_prefix='/A')
app.register_blueprint(b_bp, url_prefix='/B')

接着我们使用命令flask routes查看当前程序注册的所有路由,返回结果如下:

$ flask routes
Endpoint       Methods  Rule
-------------  -------  ---------------------------
A.index        GET      /A/
B.index        GET      /B/
static         GET      /static/<path:filename>

从输出结果可以看出,每个路由的URL规则(Rule)对应的端点(Endpoint)不再仅仅是视图函数名,而是“蓝本名.视图函数名”的形式,即扩展了端点的命名空间,解决了不同蓝本中视图函数重名的问题。

posted @ 2020-11-28 23:16  sekairain  阅读(153)  评论(0)    收藏  举报