动态 Web 应用程序的有意义 URL

PythonPythonBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

现代 Web 应用程序使用有意义的 URL 来帮助用户。如果页面使用了一个用户可以记住并直接访问的有意义的 URL,用户更有可能喜欢该页面并再次访问。在本实验中,我们将重点介绍如何在 Flask 中实现动态 URL 并将多个规则附加到一个函数上。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/ModulesandPackagesGroup(["Modules and Packages"]) python(("Python")) -.-> python/FileHandlingGroup(["File Handling"]) python(("Python")) -.-> python/AdvancedTopicsGroup(["Advanced Topics"]) python(("Python")) -.-> python/BasicConceptsGroup(["Basic Concepts"]) python(("Python")) -.-> python/FunctionsGroup(["Functions"]) python/BasicConceptsGroup -.-> python/strings("Strings") python/FunctionsGroup -.-> python/function_definition("Function Definition") python/FunctionsGroup -.-> python/keyword_arguments("Keyword Arguments") python/ModulesandPackagesGroup -.-> python/importing_modules("Importing Modules") python/FileHandlingGroup -.-> python/with_statement("Using with Statement") python/AdvancedTopicsGroup -.-> python/decorators("Decorators") subgraph Lab Skills python/strings -.-> lab-148877{{"动态 Web 应用程序的有意义 URL"}} python/function_definition -.-> lab-148877{{"动态 Web 应用程序的有意义 URL"}} python/keyword_arguments -.-> lab-148877{{"动态 Web 应用程序的有意义 URL"}} python/importing_modules -.-> lab-148877{{"动态 Web 应用程序的有意义 URL"}} python/with_statement -.-> lab-148877{{"动态 Web 应用程序的有意义 URL"}} python/decorators -.-> lab-148877{{"动态 Web 应用程序的有意义 URL"}} end

路由装饰器

在这一步中,你将使用 route() 装饰器将多个视图函数与多个 URL 绑定。

  1. 打开 route_decorator.py 文件,导入 Flask 类并创建其实例。
from flask import Flask
app = Flask(__name__)
  1. 接下来,我们使用 route() 装饰器创建两个路由 //hello,并绑定相应的视图函数,使它们分别返回 Index PageHello, World
@app.route('/')
def index():
    return 'Index Page'

@app.route('/hello')
def hello():
    return 'Hello, World'
  1. 创建一个 main 入口点,用于在端口 5000 启动 Flask 应用程序,并启用 debug 模式。
if __name__ == "__main__":
    app.run(host='0.0.0.0', port=5000, debug=True)
  1. 要运行应用程序,首先在终端中使用以下命令启动 Flask 应用程序:
python3 route_decorator.py

然后打开位于界面顶部的 "Web 5000" 标签,刷新页面,你将看到 Index Page 消息。

对于路由 /hello,你可以直接在 URL 栏中添加后缀 hello

Flask 路由装饰器示例

然后页面将显示 Hello, World 消息。

变量规则

在这一步中,你将通过使用 <variable_name> 标记部分 URL 来添加变量部分。此外,你还可以使用转换器(converter)来指定参数的类型,例如 <converter:variable_name>

  1. 打开 variable_rules.py 文件,首先导入 Flask 类和 escape,然后创建 Flask 类的实例。
from flask import Flask
from markupsafe import escape
app = Flask(__name__)
  1. route() 装饰器中,添加 <variable_name><converter:variable_name> 模式,以创建带有变量部分的动态 URL。让视图函数返回格式化字符串。
@app.route('/user/<username>')
def show_user_profile(username):
    ## 显示该用户的个人资料
    return f'User {escape(username)}'

@app.route('/post/<int:post_id>')
def show_post(post_id):
    ## 显示具有给定 id 的文章,id 为整数
    return f'Post {post_id}'

@app.route('/path/<path:subpath>')
def show_subpath(subpath):
    ## 显示 /path/ 之后的子路径
    return f'Subpath {escape(subpath)}'
  • 以下是常见转换器类型的表格:
类型 作用
string (默认)接受任何不包含斜杠的文本
int 接受正整数
float 接受正浮点数值
path 类似于 string,但也接受斜杠
uuid 接受 UUID 字符串
  1. 创建一个 main 入口点,用于在端口 5001 启动 Flask 应用程序,并启用 debug 模式。
if __name__ == "__main__":
    app.run(host='0.0.0.0', port=5001, debug=True)
  1. 要运行应用程序,首先在新的终端中使用以下命令启动 Flask 应用程序:
python3 variable_rules.py

然后打开位于界面顶部的 "Web 5001" 标签,直接在 URL 栏中添加后缀 user/Alice

Flask 动态 URL 示例

然后页面将显示 User Alice 消息。

  1. 你还可以对后缀 post/1path/some/path 重复相同的操作。对于后缀 post/1,页面将显示消息 Post 1。对于后缀 path/some/path,页面将显示消息 Subpath some/path

重定向行为

在这一步中,你将学习两种规则在使用尾部斜杠时的区别。

  1. 打开 redirection_behavior.py 文件,导入 Flask 类并创建其实例。
from flask import Flask
app = Flask(__name__)
  1. 使用 route() 装饰器创建一个名为 /projects/ 的路由,并绑定一个名为 projects 的视图函数。
@app.route('/projects/')
def projects():
    return 'The project page'

projects 端点的规范 URL 带有尾部斜杠。它类似于文件系统中的文件夹。如果你访问没有尾部斜杠的 URL(/projects),Flask 会将你重定向到带有尾部斜杠的规范 URL(/projects/)。

  1. 创建另一个名为 /about 的路由,并绑定一个名为 about 的视图函数。
@app.route('/about')
def about():
    return 'The about page'

about 端点的规范 URL 没有尾部斜杠。它类似于文件的路径名。访问带有尾部斜杠的 URL(/about/)会产生 404 Not Found 错误。这有助于保持这些资源的 URL 唯一性,从而帮助搜索引擎避免重复索引同一页面。

  1. 创建一个 main 入口点,用于在端口 5002 启动 Flask 应用程序,并启用 debug 模式。
if __name__ == "__main__":
    app.run(host='0.0.0.0', port=5002, debug=True)
  1. 要运行应用程序,首先在新的终端中使用以下命令启动 Flask 应用程序:
python3 redirection_behavior.py

然后打开位于界面顶部的 "Web 5002" 标签,直接在 URL 栏中添加后缀 projects

Flask projects 路由示例

然后页面将显示 The project page 消息,因为它重定向到了 /projects/ 路由。

将后缀改为 about/ 而不是 projects

404 错误页面显示

你应该会看到 Not Found 消息,这表示发生了 404 错误。将后缀改为 about,然后页面将正确显示 The about page 消息。

URL 构建

在这一步中,你将使用 url_for() 函数为特定函数构建 URL。它接受函数名作为第一个参数,以及任意数量的关键字参数,每个参数对应 URL 规则中的变量部分。未知的变量部分将作为查询参数附加到 URL 中。

  1. 打开 url_building.py 文件,首先导入 Flask 类和 url_for。同时不要忘记创建 Flask 类的实例。
from flask import Flask, url_for
app = Flask(__name__)
  1. 使用 route() 装饰器创建三个路由,并定义相应的视图函数。
@app.route('/')
def index():
    return 'index'

@app.route('/login')
def login():
    return 'login'

@app.route('/user/<username>')
def profile(username):
    return f'{username}\'s profile'
  1. 我们使用 test_request_context() 方法来测试 url_for()。它告诉 Flask 即使我们在使用 Python shell 时也要表现得像在处理请求一样。
with app.test_request_context():
    print(url_for('index'))
    print(url_for('login'))
    print(url_for('login', next='/'))
    print(url_for('profile', username='John Doe'))
  • url_for('index') 为视图函数 index 生成 URL,结果为 /
  • url_for('login') 为视图函数 login 生成 URL,结果为 /login
  • url_for('login', next='/') 为视图函数 login 生成 URL,并包含一个额外的查询参数 next,结果为 /login?next=/
  • url_for('profile', username='John Doe') 为视图函数 profile 生成 URL,并将 username 变量设置为 John Doe,结果为 /user/John%20Doe
  1. 在新的终端中直接运行 url_building.py 文件:
python3 url_building.py

它应该输出:

/
/login
/login?next=/
/user/John%20Doe

总结

在本实验中,我们学习了多种创建有意义 URL 的方法,这在设计 Web 应用程序时非常重要。通过熟练使用 Flask 的路由功能,你可以创建组织良好且直观的 URL,从而提升用户体验。