Flask之路由
路由就是一种映射关系。是绑定应用程序和url地址的一种一对一的映射关系!我们在开发过程中,编写项目时所使用的路由往往是指代了框架/项目中用于完成路由功能的类,这个类一般就是路由类,简称路由。
路由的基本使用
from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello World' # 指定访问路径为 demo @app.route('/demo') def demo1(): return 'demo' if __name__ == '__main__': app.run()
注意:路由和视图的名称必须全局唯一,不能出现重复,否则报错。
Flask中的参数
- 都是关键字参数
- 默认标识是<>
- username需要和对应的视图函数的参数名字保持一致。
- 参数允许有默认值:
- 如果有默认值,那么在路由中,不传输参数也是可以的。
- 如果没有默认值,参数在路由中必须传递。
- 参数默认类型是string,如果想修改为其它类型,如下
<参数类型:username>
# 设置username为int类型 <int:username>
注意:路由参数就是url路径的一部分
任意路由参数接收
@app.route('/user/<uid>') def user(uid): return f'uid={uid}'
运行结果:
限定路由参数接收
flask系统自带转换器编写在werkzeug.routing.py文件中的DEFAULT_CONVERTERS字典中。系统自带的转换器具体使用方式在每种转换器的注释代码中有写。
DEFAULT_CONVERTERS = { "default": UnicodeConverter, "string": UnicodeConverter, # 默认类型,接受不带斜杠的任何文本 default、string是一样的 "any": AnyConverter, # 可以指定多种路径 "path": PathConverter, # 接收string但也接受斜线 "int": IntegerConverter, # 接受正整数 "float": FloatConverter, # 接受正浮点值 "uuid": UUIDConverter, # 接受UUID(通用唯一识别码)字符串 xxxx-xxxx-xxxxx-xxxxx }
int、float
给参数指定类型,就在参数前加上参数类型和冒号即可。如下,指定id是int类型,可以直接进行运算。
@app.route('/user1/<int:id>') def user1(id): id = str(id ** 2) return id
运行结果:
path
指定path类型,可以获取当前路径,值得注意的是获取的不是完整路径,只是此处传入的路径参数,如下获取的路径是 testpath/test
@app.route('/<path:url_path>/') def user2(url_path): return f'url_path = {url_path}'
运行结果:
uuid
@app.route('/user3/<uuid:uu>') def user3(uu): return f'uu = {uu}'
运行结果:
any
@app.route('/user4/<any(article,blog):url_path>') def user4(url_path): return f'url_path = {url_path}' # 以上例子中,user4这个函数可以接受两个URL,一个是http://127.0.0.1:5000/user4/article/,另一个是http://127.0.0.1:5000/user4//blog/。并且,一定要传url_path参数,当然这个url_path的名称可以随便。
运行结果:
自定义路由转换器
也叫正则匹配路由参数.
在 web 开发中,可能会出现限制用户访问规则的场景,那么这个时候就需要用到正则匹配,根据自己的规则去限定请求参数再进行访问
具体实现步骤为:
- 导入转换器基类:在 Flask 中,所有的路由的匹配规则都是使用转换器对象进行记录
- 自定义转换器:自定义类继承于转换器基类BaseConverter
- 添加转换器到默认的转换器字典中
- 使用自定义转换器实现自定义匹配规则
# 导入转换器基类 from werkzeug.routing import BaseConverter # 自定义正则转换器 class RegexConverter(BaseConverter): def __init__(self, map, *args): super().__init__(map) # 正则参数 self.regex = args[0] # 将自定义转换器添加到转换器字典中,并指定转换器使用时名字为: re app.url_map.converters['re'] = RegexConverter # 正则匹配路由 @app.route("/sms/<re('1[3-9]\d{9}'):mobile>") def sms(mobile): return f"mobile={mobile}"
运行结果:
路由限定请求方式
flask中请求默认是get请求,若想要指定其他请求方式,用参数methods指定。
如用户注册时,需要把用户填写的数据存入数据库,生成一条新用户的记录,此处就需要用到post请求。
@app.route('/register/', methods=['POST']) def register(): register_dict = request.form username = register_dict['usrename'] password = register_dict.get('password') user = User() user.username = username user.password = password db.session.add(user) db.session.commit() return '创建用户成功'
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?