Flask路由endpoint
Flask中的endpoint
再Flask中注册路由时,最常用的方法是使用装饰器(decorator)。
@app.route('/')
def index():
return 'Hello World'
把视图函数(view-func)注册到app
上,URL是/
,思路简单直接。但还有一种方法,一般配合工厂函数(Factory Function)使用。
def index():
return 'Hello World'
app.add_url_rule('/', view_func=index, endpoint='index')
参数endpoint我们可以把它看作路由和视图函数的中转站,或者是连接点。在@app.route
中并不是没有这个参数,而是将其默认设置为视图函数的名称,也可以手动设置endpoint
参数。
Endpoint的用途
endpoint通常用来“反向查找”。例如,从一个页面跳转到另一个页面时,可以使用url_for(endpoint,**values) 。
@app.route('/')
def index():
return redirect(url_for(endpoint='give_greeting',name="Mark"))# This will print '/greeting/Mark'
@app.route('/greeting/<name>')
def give_greeting(name):
return 'Hello, {0}!'.format(name)
这是为了更加方便的组织路由和视图函数。我个人是这样理解的,
endpoint
是flask作者 刻意加入的一个东西,方便组织路由和视图函数,你可以随便改url,也可以随便改view-func
,而通过固定的endpoint
,路由之间的调用和跳转(比如url_for())可以不受任何影响。不是非有不可,但是有它会方便很多
举例子
from flask import Flask, url_for, redirect
from flask import Blueprint
app = Flask(__name__)
admin = Blueprint('admin', __name__)
@app.route('/')
def index():
return redirect(url_for(endpoint='sayhello',name="lisa"))
@app.route('/login2/<name>', methods=['get', 'post'],endpoint="sayhello")
def login(name):
return f"hello world {name}"
if __name__ == '__main__':
print(app.view_functions)
print(app.url_map)
app.run()
蓝图中使用
注意,在两个蓝本中路由地址*‘/greeting’的函数都叫"greeting"
。如果我想调用admin对应的greeting
函数,我不能说“我想要greeting*”,因为这里还有一个user对应的greeting
函数。端点这时就发挥作用了:指定一个蓝本名称作为端点的一部分–通过这种方式端点实现了对命名空间的支持。所以,我们可以这样写:
print url_for('admin.greeting') # Prints '/admin/greeting'
print url_for('user.greeting') # Prints '/user/greeting'
举例子
from flask import Flask, url_for, redirect
from flask import Blueprint
app = Flask(__name__)
admin = Blueprint('admin', __name__)
@admin.route('/greeting')
def greeting():
return 'Hello, administrative user!'
user = Blueprint('user', __name__)
@user.route('/greeting')
def greeting():
return 'Hello, lowly normal user!'
app.register_blueprint(admin, url_prefix='/admin')
app.register_blueprint(user, url_prefix='/user')
@app.route('/')
def index():
# return redirect(url_for(endpoint='admin.greeting'))
return redirect(url_for(endpoint='user.greeting'))
if __name__ == '__main__':
print(app.view_functions)
print(app.url_map)
app.run()