Flask入门篇(二)路由配置

10 篇文章 0 订阅
from flask import Flask, redirect, url_for
from werkzeug.routing import BaseConverter


app = Flask(
    __name__,
    static_url_path="/python",
    static_folder="static",
    template_folder="templates"
)

"""
解析1:在flask中app的请求方式是GET、OPTIONS、HEAD,如果我们要添加其他的访问方式就要在配置路由的时候带上methods并传递请求方式
解析2:如果有两个一样的访问路径和请求方式,app.url_map先打印出来的会把后面的都覆盖掉,所以注意访问路径和请求方式决定是否是同一个请求
解析3:多个请求地址对应一个视图函数时可以用多个装饰器装饰
解析4:使用url_for函数进行路径反推,通过视图函数的名字找到视图对应的url路径,好处是避免改一处动全身
"""
# 最基础的路由
@app.route("/index")
def index():
    return '<h1>Hello World</h1></br><h2>DEBUG=True</h2>'
@app.route("/request/post", methods=["GET","POST"])
def request_post():
    return '<h1>set post success</h1>'
# 带上请求方式的路由,进行是否是同一个请求验证
@app.route("/hello", methods=["POST"])
def hello1():
    return '<h1>hello1</h1>'
@app.route("/hello", methods=["GET"])
def hello2():
    return '<h1>hello2</h1>'
@app.route("/hello", methods=["GET"])
def hello3():
    return '<h1>hello3</h1>'
# 多个路由对一个视图
@app.route("/hi1")
@app.route("/hi2")
def hellomany():
    return '<h1>many hi</h1>'
# url_for函数展示
@app.route("/login", methods=["GET"])
def login():
    url = url_for("index")
    return redirect(url)


"""
解析1:转换器的固有写法<转换器名:参数名>
解析2:正则匹配获取路径参数,转换器有int、float、str、path(接受斜线)
解析3:访问http://127.0.0.1:5000/goods/123abc,如果是不加转换器则匹配goods_id=123abc,默认除了/外的所有普通字符串
解析4:访问http://127.0.0.1:5000/goods/123,如果是int转换器则匹配goods_id=123,什么样的转换器匹配什么样的字符
"""
# 不加转换器
@app.route("/goods/<goods_id>")
def goods_detail1(goods_id):
    return "goods detail all %s" % goods_id
# 加转换器int
@app.route("/goods/<int:goods_id>")
def goods_detail2(goods_id):
    return "goods detail int %s" % goods_id


"""
手动实现转换器
1.定义自己的转换器
2.设置将自定义的转换器添加到flask应用中
3.使用自定义的转换器
"""
"""
解析1:路由自定义的转换器格式为<转换器名(匹配规则):参数名>,匹配规则就是转换器的参数regex
解析2:转换器实现继承自werkzeug.routing中的BaseConverter,BaseConverter是所有转换器的基类map接收路由映射信息,regex接收自定义正则匹配规则
解析3:app.url_map.converters是一个字典对象,可以建立路由和转换器之间的联系,当访问send_sms函数时路由会通过converters找到对应的转换器类
解析4:自定义转换器中必须知道:
    url_map是一个固定的第一个参数,是在手动实现转换器第二步时flask自动会把路由映射信息传给他,在自定义的转换器中用不到,是传递给父类使用的
    self.regex是固定的,来自父类的,用来存正则表达式,flask会去使用这个属性来进行路由的正则匹配
    to_python方法是BaseConverter中werkzeug约定了自动实现to_python方法,返回正则匹配的结果给视图函数的参数,我们可以对结果进一步处理
    to_url方法是使用url_for的时候会被调用,返回url_for传递的参数
列子说明:
访问http://127.0.0.1:5000/head调用head()视图,遇到url_for函数flask会自动调用to_url()方法
返回phone所对应的值18411111111,而url_for把返回的参数交给视图函数"send_sms"对应的路由处理,
最终返回url="/send/18411111111",重定向url访问send_sms函数视图,路由先解析发现url中有要匹配
的数据,于是通过app.url_map.converters找到对应转换器RegexConverter,flask把路由信息传递给
url_map交给BaseConverter基类使用,同时把re转换器后面带的正则匹配规则交由regex传递给BaseConverter
基类,当url重定向给send_sms视图函数时,url经过路由,flask会自动调用to_python把18411111111匹
配出来作为参数传递进来,经过之后会返回给send_sms视图参数phone,即phone参数是to_python的返回值。
"""
# 1.定义自己的万能转换器
class RegexConverter(BaseConverter):
    def __init__(self, url_map, regex):
        super().__init__(url_map)
        self.regex = regex

    def to_python(self, value):
        return value

    def to_url(self, value):
        return value

# 2.设置将自定义的转换器添加到flask应用中
app.url_map.converters["re"] = RegexConverter

# 3.使用自定义的转换器
@app.route("/send/<re(r'1[358]\d{9}'):phone>")
def send_sms(phone):
    return "send sms to %s" % phone
@app.route("/head")
def head():
    url = url_for("send_sms", phone="18411111111")
    return redirect(url)


if __name__ == '__main__':
    # 打印flask路由配置映射信息
    print(app.url_map)
    app.run(host="0.0.0.0", port=5000, debug=True)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值