当前位置: 首页 > 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.dtcms.com/a/309938.html

相关文章:

  • 嵌入式学习笔记-MCU阶段-DAY10ESP8266模块
  • 第11届蓝桥杯Python青少组中/高级组选拔赛(STEMA)2020年5月30日真题
  • 嵌入式软件 (SW) 设计文件
  • W3D引擎游戏开发----从入门到精通【10】
  • 永洪科技华西地区客户交流活动成功举办!以AI之力锚定增长确定性
  • 视频生成中如何选择GPU或NPU?
  • UE5多人MOBA+GAS 番外篇:同时造成多种类型伤害,以各种属性值的百分比来应用伤害(版本二)
  • 如何理解推理模型
  • 学习:入门uniapp Vue3组合式API版本(17)
  • 2025网络安全指南
  • PyTorch基础——张量计算
  • 考取锅炉司炉工证需要学习哪些专业知识?
  • Altium Designer 22使用笔记(3)---原理图设计
  • Google play上架/更新频繁被拒是什么原因?
  • RabbitMQ 延时队列插件安装与使用详解(基于 Delayed Message Plugin)
  • C++ sort比较规则需要满足严格弱序
  • Coze Studio概览(五)--工作流管理
  • 人员定位卡人脸智能充电发卡机
  • Spring Boot + MongoDB:从零开始手动配置 MongoConfig 实战
  • 拉横幅识别误检率↓82%:陌讯多模态特征融合算法实战解析
  • Typecho博客数据迁移全指南:从数据库导出到XML导入的完整方案
  • 【04】海康相机C#开发——VS 在编译时,提示“Files的值“+乱码情况解决办法’ ,C#项目打开编译时报错:Files 的值“IGEF‘,
  • Docker状况监控
  • 智能平台的感知进化:AI × 视频通感在群体终端协同中的应用探索
  • linux下非Docker模式部署Xinference并部署Rerank模型
  • Android Frameworks从零开始
  • 车辆违停识别漏检率↓76%:陌讯动态区域感知算法实战解析
  • RA4M2_MINI开发(5)----GPIO输入检测
  • 探索 VMware 虚拟机:开启虚拟化世界的大门
  • SIP 呼叫中实现远端摄像头控制学习笔记