Flask 的路由系统是其核心功能之一,它负责将 URL 地址映射到相应的 Python 视图函数。
下面开始介绍 Flask 的路由机制。
1. 基本路由定义
最简单的路由
@app.route('/')
def index():
return '欢迎来到首页'
多 URL 路由同一个视图
@app.route('/')
@app.route('/home')
@app.route('/index')
def home():
return '首页内容'
2. 动态路由参数
基本变量规则
@app.route('/user/<username>')
def show_user(username):
return f'用户名: {username}'
变量类型转换器
转换器类型 | 说明 | 示例 |
---|---|---|
string | 默认类型,接受不含斜杠的文本 | <string:name> |
int | 接受正整数 | <int:post_id> |
float | 接受浮点数 | <float:version> |
path | 类似 string 但接受斜杠 | <path:subpath> |
uuid | 接受 UUID 字符串 | <uuid:uuid_str> |
@app.route('/post/<int:post_id>')
def show_post(post_id):
return f'文章ID: {post_id} (类型: {type(post_id)})'
@app.route('/path/<path:subpath>')
def show_subpath(subpath):
return f'子路径: {subpath}'
3. HTTP 方法处理
指定允许的 HTTP 方法
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
return do_login(request.form)
else:
return show_login_form()
快捷装饰器
@app.get('/profile')
def profile():
return 'GET请求的个人资料页'
@app.post('/submit')
def submit():
return '处理POST提交'
4. URL 构建与反向解析
url_for() 函数
from flask import url_for
@app.route('/')
def index():
return f'''
用户页链接: {url_for('show_user', username='john')}
文章页链接: {url_for('show_post', post_id=123)}
'''
带查询参数的 URL 构建
url_for('show_user', username='john', page=2, _external=True)
# 生成: http://example.com/user/john?page=2
5. 路由高级特性
自定义转换器
from werkzeug.routing import BaseConverter
class ListConverter(BaseConverter):
def to_python(self, value):
return value.split(',')
def to_url(self, values):
return ','.join(str(v) for v in values)
app.url_map.converters['list'] = ListConverter
@app.route('/items/<list:items>')
def show_items(items):
return f"项目列表: {items} (类型: {type(items)})"
路由端点(endpoint)
@app.route('/about', endpoint='about_page')
def about():
return '关于我们'
# 在其他地方可以通过端点名引用
url_for('about_page') # 生成: /about
6. 蓝图(Blueprint)中的路由
定义蓝图路由
from flask import Blueprint
auth = Blueprint('auth', __name__)
@auth.route('/login')
def login():
return '登录页面'
@auth.route('/logout')
def logout():
return '登出页面'
带前缀的蓝图路由
admin = Blueprint('admin', __name__, url_prefix='/admin')
@admin.route('/dashboard')
def dashboard():
return '管理后台'
7. 路由错误处理
自定义 404 页面
@app.errorhandler(404)
def page_not_found(error):
return render_template('404.html'), 404
特定路由的错误处理
@app.route('/admin')
def admin():
if not current_user.is_admin:
abort(403) # 禁止访问
return '管理页面'
@app.errorhandler(403)
def forbidden(error):
return render_template('403.html'), 403
8. 路由性能优化
路由缓存装饰器
from functools import lru_cache
@lru_cache(maxsize=32)
def expensive_operation():
# 耗时操作
return result
@app.route('/expensive')
def expensive_route():
result = expensive_operation()
return f"结果: {result}"
URL 规则预处理
@app.url_value_preprocessor
def pull_lang_code(endpoint, values):
if values is not None:
g.lang_code = values.pop('lang_code', None)
@app.route('/<lang_code>/about')
def about():
return f"当前语言: {g.lang_code}"
9. 路由调试技巧
查看所有路由规则
print(app.url_map)
路由匹配测试
with app.test_request_context('/user/john'):
print(request.url_rule) # 输出匹配的路由规则
10. 最佳实践
- 保持路由简洁:避免过于复杂的URL结构
- 合理组织路由:使用蓝图将相关路由分组
- RESTful 设计:对资源使用适当的HTTP方法
- GET:获取资源
- POST:创建资源
- PUT:更新资源
- DELETE:删除资源
- 版本控制:在API路由中包含版本号
@app.route('/api/v1/users') def get_users_v1(): pass
- 安全性考虑:
- 验证所有输入参数
- 对敏感操作使用POST而非GET
- 实施适当的权限检查
总结
Flask 的路由系统提供了强大而灵活的方式来定义 URL 与视图函数之间的映射关系。通过掌握:
- 基本路由和动态路由
- HTTP 方法处理
- URL 构建与反向解析
- 自定义转换器
- 蓝图路由组织
- 错误处理和优化技巧
Flask 的路由设计既适合简单的应用场景,也能通过扩展满足复杂的企业级应用需求。