Flask路由设置

1. 接收任意路由参数

# 路由可以接收不限定类型的路由参数,默认按/分割参数
@app.route(rule="/users/<cid>/<num>")
# 路由设置了路由参数,在被装饰的视图中必须声明同名的视图参数用于接收,否则报错
def index(num, cid):
    print(cid, type(cid))
    print(num, type(num)) # <class 'str'>
    return f"<h1>cid={cid}, num={num}, flask!!!</h1>"

# 可以发现,上面的路由参数在视图接收以后,默认格式是字符串,即便url地址中写的数字,
# 所以我们需要对路由参数的类型或者格式要进一步的约束

2. 接收限定类型参数

转换器名称 描述
string 默认类型,接受不带斜杠的任何文本
int 接受正整数
float 接受正浮点值
path 接收string但也接受斜线
uuid 接受UUID(通用唯一识别码)字符串 xxxx-xxxx-xxxxx-xxxxx
# 限定类型的路由参数
# 不仅可以转换参数的数据类型,还可以达到匹配的目的,匹配不上,则404
@app.route("/goods/<int:cid>")
def goods_list(cid):
    print(cid, type(cid))  # <class 'int'>
    return f"cid={cid}"

3. 自定义路由参数转换器(正则匹配路由转换器)

  • 1.导入转换器基类
    from werkzeug.routing import BaseConverter
    
  • 2.自定义转换器
    class RegexConverter(BaseConverter):
        def __init__(self, map, *args):
            super().__init__(map)
            # 正则参数
            self.regex = args[0]
    
  • 3.添加转换器到默认的转换器字典中,并指定转换器使用时名字为:re
    app.url_map.converters['re'] = RegexConverter
    
  • 4.使用转换器去实现自定义匹配规则(此处定义规则是:手机号码)
    @app.route("/sms/<re('1[3-9]\d{9}'):mobile>")
    def sms(mobile):
        return f"mobile={mobile}"
    
posted @ 2021-12-24 18:04  vetra  阅读(112)  评论(0)    收藏  举报