1. 程式人生 > >使用url_for()時,會自動調用轉換器的to_url()方法

使用url_for()時,會自動調用轉換器的to_url()方法

ase 分享 alt 自動 edi rect self. deb def

視圖反推url,在動態url(轉換器)反推中的應用

技術分享圖片

# -*- coding: utf-8 -*-
from  flask import Flask, url_for, redirect
from werkzeug.routing import BaseConverter

app = Flask(__name__)


# 轉換器
# 127.0.0.1:5000/goods/123
@app.route("/goods/<int:goods_id>")
# @app.route("/goods/<goods_id>")  # 不加轉換器類型, 默認是普通字符串規則(除了/的字符)
def goods_detail(goods_id):
    """定義的視圖函數"""
    return "goods detail page %s" % goods_id


# 1. 定義自己的轉換器
class MobileConverter(BaseConverter):
    def __init__(self, url_map):
        super(MobileConverter, self).__init__(url_map)
        self.regex = r‘1[34578]\d{9}‘


class RegexConverter(BaseConverter):
    """"""

    def __init__(self, url_map, regex):
        # 調用父類的初始化方法
        super(RegexConverter, self).__init__(url_map)
        # 將正則表達式的參數保存到對象的屬性中,flask會去使用這個屬性來進行路由的正則匹配
        self.regex = regex

    def to_python(self, value):
        """"""
        print("to_python方法被調用")
        # return "abc"
        # value是在路徑進行正則表達式匹配的時候提取的參數
        return value

    def to_url(self, value):
        """使用url_for的方法的時候被調用"""
        print("to_url方法被調用")
        return "15811111111"
        # return value


# 2. 將自定義的轉換器添加到flask的應用中
app.url_map.converters["re"] = RegexConverter
app.url_map.converters["mobile"] = MobileConverter


# 127.0.0.1:5000/send/18612345678
# @app.route("/send/<mobile:mobile_num>")
@app.route("/send/<re(r‘1[34578]\d{9}‘):mobile_num>")
def send_sms(mobile_num):
    return "send sms to %s" % mobile_num


@app.route("/index")
def index():
    url = url_for("send_sms", mobile_num="18922222222")
    # /send/18922222222
    return redirect(url)


if __name__ == ‘__main__‘:
    # 通過url_map可以查看整個flask中的路由信息
    print(app.url_map)
    # 啟動flask程序
    app.run(debug=True)

  

訪問:http://127.0.0.1:5000/index

跳轉:http://127.0.0.1:5000/send/15811111111

技術分享圖片

修改to_url後

技術分享圖片

技術分享圖片

使用url_for()時,會自動調用轉換器的to_url()方法