Flask - URL 构建
Flask – URL 构建 (URL Building)
Section titled “Flask – URL 构建 (URL Building)”在应用程序中(例如,在模板或重定向函数中)硬编码(hardcoding)URL 通常是一种不好的做法。如果您以后重构了路由(例如,将 /user/<name> 更改为 /profile/<name>),您将不得不手动找到并更新每一个硬编码的 URL。这既繁琐又容易出错。
Flask 提供了 url_for() 函数,可以根据视图函数(view function)的 endpoint 名称 来动态构建 URL。这使得您的应用程序更易于维护,且不易因路由更改而失效。
url_for() 函数
Section titled “url_for() 函数”url_for() 函数的第一个参数是视图函数的 endpoint 名称。默认情况下,endpoint 名称就是视图函数本身的名称(例如,def admin_dashboard(): 的 endpoint 就是 'admin_dashboard')。
如果与 endpoint 关联的路由包含变量部分(variable parts),例如 /guest/<guest_name> 中的 <guest_name>,则必须将这些部分的值作为关键字参数(keyword arguments)提供给 url_for()。
示例:
from flask import Flask, redirect, url_for
app = Flask(__name__)
@app.route('/admin')def admin_dashboard(): # 管理面板的视图函数 return 'Admin Dashboard'
@app.route('/guest/<guest_name>')def guest_greeting(guest_name): # 问候访客的视图函数 # 使用 f-string 进行现代字符串格式化 return f'Hello {guest_name}, welcome as Guest!'
@app.route('/user/<name>')def user_profile(name): # 此函数检查名称并使用 url_for() 进行重定向 if name == 'admin': # 为 'admin_dashboard' endpoint 构建 URL target_url = url_for('admin_dashboard') # target_url 将是 '/admin' return redirect(target_url) else: # 为 'guest_greeting' endpoint 构建 URL, # 提供所需的 'guest_name' 变量。 target_url = url_for('guest_greeting', guest_name=name) # 如果 name='Alice',target_url 将是 '/guest/Alice' return redirect(target_url)
if __name__ == '__main__': app.run(debug=True)工作原理:
user_profile(name)函数从 URL 接收一个名称(例如,访问/user/admin会将name设置为'admin')。- 如果
name是 ‘admin’,url_for('admin_dashboard')会查找与admin_dashboard函数关联的路由(route),并生成相应的 URL 路径,即/admin。 - 如果
name是其他任何值(例如 ‘Alice’),url_for('guest_greeting', guest_name=name)会查找guest_greeting函数的路由(/guest/<guest_name>),并将name的值 (‘Alice’) 替换到guest_name变量部分,生成 URL 路径/guest/Alice。 redirect()函数随后向浏览器发送一个响应,指示其导航到生成的 URL。
测试示例:
-
将代码保存为
app.py并运行它 (python app.py)。 -
打开浏览器并访问
http://127.0.0.1:5000/user/admin。
浏览器将被重定向到 http://127.0.0.1:5000/admin 并显示:
Admin Dashboard- 现在访问
http://127.0.0.1:5000/user/Alice(或除了 ‘admin’ 之外的任何名称)。
浏览器将被重定向到 http://127.0.0.1:5000/guest/Alice 并显示:
Hello Alice, welcome as Guest!url_for() 的优点:
- 可维护性 (Maintainability): 如果您更改了
@app.route装饰器中的路由路径,url_for()会自动在所有使用该 endpoint 名称的地方生成正确的新 URL。无需手动查找和替换。 - 可读性 (Readability):
url_for('profile')通常比/user/profile/view更清晰。 - 处理转义 (Handles Escaping):
url_for()会正确处理变量部分中特殊字符的转义。 - 绝对 URL (Absolute URLs): 如果需要,可以使用
_external=True生成绝对 URL(包括域名)(例如,url_for('guest_greeting', guest_name='Bob', _external=True))。
在 Flask 应用程序内部(尤其是在模板和重定向中)链接到另一个页面时,使用 url_for() 是标准做法。