0
点赞
收藏
分享

微信扫一扫

Flask学习_04_Flask路由endpoint

追梦人的自留地 2022-03-19 阅读 58

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()
举报

相关推荐

0 条评论