当前位置: 首页 > news >正文

Flask 路由系统:URL 到 Python 函数的映射

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 BaseConverterclass 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 Blueprintauth = 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. 最佳实践

  1. 保持路由简洁:避免过于复杂的URL结构
  2. 合理组织路由:使用蓝图将相关路由分组
  3. RESTful 设计:对资源使用适当的HTTP方法
    • GET:获取资源
    • POST:创建资源
    • PUT:更新资源
    • DELETE:删除资源
  4. 版本控制:在API路由中包含版本号
    @app.route('/api/v1/users')
    def get_users_v1():pass
    
  5. 安全性考虑
    • 验证所有输入参数
    • 对敏感操作使用POST而非GET
    • 实施适当的权限检查

总结

Flask 的路由系统提供了强大而灵活的方式来定义 URL 与视图函数之间的映射关系。通过掌握:

  • 基本路由和动态路由
  • HTTP 方法处理
  • URL 构建与反向解析
  • 自定义转换器
  • 蓝图路由组织
  • 错误处理和优化技巧

Flask 的路由设计既适合简单的应用场景,也能通过扩展满足复杂的企业级应用需求。

http://www.lryc.cn/news/607491.html

相关文章:

  • Coze Studio概览(五)--工作流管理
  • 20250801在Ubuntu24.04.2LTS下编译firefly_itx_3588j的Android12时解决boot.img过大的问题
  • 【lucene】FastVectorHighlighter案例
  • 基于线性规划的储能充放电仿真系统
  • Android Frameworks从零开始
  • JSON 对象在浏览器中顺序与后端接口返回不一致的问题
  • 好未来披露2026财年Q1财报:净利润3128万美元,同比大增174%
  • Day 28:类的定义和方法
  • Git 命令使用指南:从入门到进阶
  • MySQL CPU占用过高排查指南
  • 数据处理四件套:NumPy/Pandas/Matplotlib/Seaborn速通指南
  • Agents-SDK智能体开发[3]之多Agent执行流程
  • SN74LVC1G08DBVR 德州仪器(TI)逻辑芯片IC 电源芯片 ESD保护
  • 智慧社区构建——2
  • C语言(02)——标准库函数大全(持续更新)
  • AI Agent 视角:可执行程序的二进制格式,是一场「结构化语言」与「智能解析」的双向奔赴
  • 一套视频快速入门并精通PostgreSQL
  • 03 Broker主从架构和集群模式
  • (二)LoRA微调BERT:为何在单分类任务中表现优异,而在多分类任务中效果不佳?
  • Hutool 的完整 JSON 工具类示例
  • 使用社区 EE 镜像运行 Ansible
  • Redis的ZipList、SkipList和ListPack之间的区别
  • 在Alpine Linux上配置Redis使用NFS存储的完整指南
  • 李宏毅深度学习教程 第4-5章 CNN卷积神经网络+RNN循环神经网络
  • 每天一点跑步运动小知识
  • 逻辑回归算法 银行贷款资格判断案例,介绍混淆矩阵与正则化惩罚
  • AG-UI 协议全面解析--下一代 AI Agent 交互框架医疗应用分析(下)
  • Python 项目路径配置完全指南
  • 51单片机入门:模块化编程
  • C#常见的转义字符