Flask 是一个轻量级的 Python Web 框架,其简洁的设计使得构建 Web 应用变得轻而易举。其中,路由是 Flask 中至关重要的一部分,它定义了 URL 与视图函数之间的映射关系,决定了用户请求的处理方式。在本文中,我们将深入探讨 Flask 路由的多种用法,包括创建路由、经典路由、动态路由等。
创建路由
在 Flask 中,通过装饰器 @app.route()
可以轻松地创建路由。下面是一个简单的示例:
from flask import Flaskapp = Flask(__name__)@app.route('/')
def index():return 'Hello, Flask!'
上述代码中,@app.route('/')
表示将 URL /
映射到了名为 index
的视图函数上,当用户访问根目录时,将会返回 ‘Hello, Flask!’。
使用add_url_rule创建路由
在 Flask 中,除了使用装饰器 @app.route
来定义路由外,你还可以使用 add_url_rule
方法来手动添加路由。add_url_rule
方法允许你在 Flask 应用中动态地添加路由规则,这在一些特定场景下可能会很有用,例如在运行时根据配置信息添加路由。
- 语法如下:
app.add_url_rule(rule, endpoint=None, view_func=None, **options)
rule
:URL 规则,即路由的路径。endpoint
:端点名称,选填,用于标识路由(即url_for
函数对应使用的标识名)。view_func
:视图函数,处理路由请求的函数。options
:其他路由选项,例如methods
、defaults
等。
- 示例
from flask import Flaskapp = Flask(__name__)def hello_world():return 'Hello, World!'# 使用 add_url_rule 方法添加路由,并指定支持的请求方法
app.add_url_rule('/', 'hello', hello_world, methods=['GET', 'POST'])# 如果不设置methods,默认使用GET
if __name__ == '__main__':app.run(debug=True)
在这个示例中,我们首先定义了一个视图函数 hello_world
,它返回字符串 'Hello, World!'
。然后,我们使用 add_url_rule
方法手动添加了一个路由,将根路径 /
映射到 hello_world
视图函数,并指定了端点名称为 'hello'
。
- 注意事项
- 当使用
add_url_rule
方法手动添加路由时,需要确保视图函数已经定义。- 如果你使用了
add_url_rule
方法添加路由,那么你不能再使用@app.route
装饰器添加相同的路由,否则会出现路由冲突。
经典路由
经典路由即静态路由,它直接将 URL 与视图函数一一对应。例如:
@app.route('/about')
def about():return 'About Us'
上述代码中,当用户访问 /about
时,将会触发名为 about
的视图函数,返回 ‘About Us’。
动态路由
动态路由允许在 URL 中包含可变的部分,这使得我们能够处理更加灵活的请求。例如,我们可以接受用户传递的参数:
@app.route('/user/<username>')
def show_user_profile(username):return 'User %s' % username
在上述示例中,<username>
表示动态部分,Flask 将会将实际的用户名作为参数传递给视图函数 show_user_profile
。
给动态路由设定变量类型
默认情况下,动态路由中的变量被视为字符串。但是,我们可以使用 <converter:variable_name>
的语法指定变量的类型。常见的类型包括 int
、float
、path
等。
@app.route('/post/<int:post_id>')
def show_post(post_id):return 'Post %d' % post_id
上述示例中,<int:post_id>
指定了 post_id
应当是一个整数。
converter
用于指定变量类型variable_name
表示变量名
- 类型参考表
URL规则 | 描述 | 示例 |
---|---|---|
/user/<string:username> | 字符串类型。匹配任何字符串,不包括斜杠。 | /user/johndoe |
/post/<int:post_id> | 整数类型。匹配正整数。 | /post/123 |
/price/<float:price> | 浮点数类型。匹配浮点数。 | /price/9.99 |
/path/<path:path> | 路径类型。匹配包含斜杠的字符串。 | /path/foo/bar |
/uuid/<uuid:uuid_value> | UUID 类型。匹配 UUID 格式的字符串。 | /uuid/123e4567-e89b-12d3-a456-426614174000 |
/any/<any:any_value> | 任意类型。匹配任何类型的字符串。 | /<any(geek,item):tmp>/<int:id> |
- 各种类型参考
from flask import Flaskapp = Flask(__name__)# 字符串类型
@app.route('/user/<string:username>')
def user_profile(username):return f'User Profile: {username}'# 整数类型
@app.route('/post/<int:post_id>')
def show_post(post_id):return f'Showing post #{post_id}'# 浮点数类型
@app.route('/price/<float:price>')
def show_price(price):return f'The price is: {price}'# 路径类型
@app.route('/path/<path:path>')
def show_path(path):return f'The path is: {path}'# UUID类型
@app.route('/uuid/<uuid:uuid_value>')
def show_uuid(uuid_value):return f'The UUID is: {uuid_value}'# 任意类型
@app.route('/<any(geek,item):tmp>/<int:id>')
def get_any(tmp, id):if tmp == "geek":return f"geek:{id}"elif tmp == "item":return f"item:{id}"else:return Noneif __name__ == '__main__':app.run(debug=True)
自定义路由变量类型
除了内置的变量类型外,我们还可以自定义路由变量类型。通过在应用对象上注册转换器,我们可以创建自己的转换逻辑。
import typing as tfrom flask import Flask
from werkzeug.routing import BaseConverterapp = Flask(__name__)# 自定义手机号码类型转换器
class PhoneConverter(BaseConverter):regex = "1[1-9]\d{9}"def to_python(self, value: str) -> t.Any:return int(value)# 注册自定义手机号码类型转换器
app.url_map.converters['phone'] = PhoneConverter# 使用自定义手机号码类型转换器的动态路由
@app.route('/phone/<phone:user_phone>')
def user_profile(user_phone):return f'你的手机号是: {user_phone}'if __name__ == '__main__':app.run(debug=True)
自定义类中的 to_python
函数决定访问后传入路由对应函数得到的Python对象是什么。
url_for函数
url_for
函数是 Flask 框架提供的一个便捷工具,用于构建 URL。它接受视图函数的名称作为参数,并返回该视图函数对应的 URL。使用 url_for
的主要好处是,它允许您在应用程序中动态地生成 URL,而不必硬编码它们。
下面是 url_for
函数的基本用法:
from flask import Flask, url_forapp = Flask(__name__)@app.route('/')
def index():return 'Hello, World!'@app.route('/user/<username>')
def profile(username):return f'Hello, {username}!'if __name__ == '__main__':with app.test_request_context():print(url_for('index')) # 输出: /print(url_for('profile', username='john')) # 输出: /user/john
/
/user/john
在上面的示例中,当您调用 url_for('index')
时,它会返回根路径 /
对应的 URL。当您调用 url_for('profile', username='john')
时,它会返回匹配 profile
路由规则并传递 username
参数的 URL,例如 /user/john
。
url_for
还接受其他参数,比如 external
和 _scheme
。external
参数用于生成绝对 URL,而不仅仅是相对路径。_scheme
参数用于指定 URL 的协议(例如 http
或 https
)。
with app.test_request_context():print(url_for('index', _external=True)) # 输出: http://localhost/
http://localhost/
url_for
函数是 Flask 应用程序中非常实用的工具,可以帮助您轻松地构建 URL,使得代码更加清晰和可维护。
结语
通过本文的介绍,我们对 Flask 路由的使用有了更深入的了解。除了基本的路由创建外,我们还学习了如何处理动态路由,以及如何自定义路由变量类型。这些功能使得 Flask 在构建 Web 应用时更加灵活和强大。希望本文对您有所帮助!