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 '创建用户成功'