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中的参数

  1. 都是关键字参数
  2. 默认标识是<>
  3. username需要和对应的视图函数的参数名字保持一致。
  4. 参数允许有默认值:
    • 如果有默认值,那么在路由中,不传输参数也是可以的。
    • 如果没有默认值,参数在路由中必须传递。
  5. 参数默认类型是string,如果想修改为其它类型,如下
    <参数类型:username>
# 设置username为int类型
 

注意:路由参数就是url路径的一部分

任意路由参数接收

@app.route('/user/')
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/')
def user1(id):
    id = str(id ** 2)
    return id

运行结果:

path

指定path类型,可以获取当前路径,值得注意的是获取的不是完整路径,只是此处传入的路径参数,如下获取的路径是 testpath/test

@app.route('//')
def user2(url_path):
    return f'url_path = {url_path}'

运行结果:

uuid

@app.route('/user3/')
def user3(uu):
    return f'uu = {uu}'

运行结果:

any

@app.route('/user4/')
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/")
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 '创建用户成功'