Flask 是一个轻量级的 Python Web 框架,其简洁的设计使得构建 Web 应用变得轻而易举。其中,路由是 Flask 中至关重要的一部分,它定义了 URL 与视图函数之间的映射关系,决定了用户请求的处理方式。在本文中,我们将深入探讨 Flask 路由的多种用法,包括创建路由、经典路由、动态路由等。
创建路由
在 Flask 中,通过装饰器 @app.route()
可以轻松地创建路由。下面是一个简单的示例:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello, Flask!'
上述代码中,@app.route('/')
表示将 URL /
映射到了名为 index
的视图函数上,当用户访问根目录时,将会返回 ‘Hello, Flask!’。
经典路由
经典路由即静态路由,它直接将 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 Flask
app = 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 None
if __name__ == '__main__':
app.run(debug=True)
自定义路由变量类型
除了内置的变量类型外,我们还可以自定义路由变量类型。通过在应用对象上注册转换器,我们可以创建自己的转换逻辑。
import typing as t
from flask import Flask
from werkzeug.routing import BaseConverter
app = 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)
结语
通过本文的介绍,我们对 Flask 路由的使用有了更深入的了解。除了基本的路由创建外,我们还学习了如何处理动态路由,以及如何自定义路由变量类型。这些功能使得 Flask 在构建 Web 应用时更加灵活和强大。希望本文对您有所帮助!