天天看點

Flask—視圖函數的路由規則設定說明

Flask是一款輕量級的web架構,隻提供web架構的核心功能,具有自由、靈活、高度定制的特點。

# 第一個Flask的例子
from flask import Flask

app = Flask(__name__)

@app.route("/")
def index():
    return "Hello, Flask!"

if __name__ == "__main__":
    app.run(host="0.0.0.0", port="1234", debug=True)
           
Flask—視圖函數的路由規則設定說明

路由設定

from flask import Flask

app = Flask(__name__)


# 定義視圖函數
@app.route("/")  # 預設get請求
def index():
    return "Hello, Flask!"


# 1、相同路徑的情況
# 路徑為"/hello",請求方式GET,對應的視圖函數hello
@app.route("/hello")
def hello():
    """
    如果路徑和請求方式一樣時,上面的URL會把下面的覆寫掉,
    如果他們的請求方式不一緻,那麼就是單獨的邏輯
    :return:
    """
    return "Hello 1"


# 路徑"/hello",請求方式GET,對應的視圖函數hello2
# 由于:這個路徑和請求方式與上一個一樣,會被覆寫,即:通路127.0.0.1:5000/hello時,這個視圖不會執行
@app.route("/hello")
def hello2():
    return "Hello 2"


# 路徑"/hello",請求方式POST,對應的視圖函數hello3
# 盡管路徑相同,但是請求方式不一緻,是以是單獨的邏輯
@app.route("/hello", methods=["POST"])
def hello3():
    return "Hello 3"


# 2、多個不同的裝飾器對應一個視圖函數的情況
# 裝飾器疊加實作兩個不同的URL對應同一個視圖函數
@app.route("/hi1")
@app.route("/hi2")
def hi():
    return "Hi page"


# 3、轉換器,flask自帶的類型有:int,float,path
# 相當于Django中的URL傳參,格式:<轉換器類型:參數名稱>
# 視圖函數裡的參數與這裡的參數名一緻
@app.route("/goods/<int:good_id>")  # 不加轉換器類型也行,預設是除了/的普通字元串規則
def goods_detail(good_id):
    return f"good detail page {good_id}"


# 4、自定義轉換器
from werkzeug.routing import BaseConverter


# 4-1、自定義一個轉換器類,需要繼承BaseConverter類
class RegexConverter(BaseConverter):
    # 初始化參數時,需要傳入一個url_map參數,父類會用到這個參數
    def __init__(self, url_map, regex):
        super().__init__(url_map)
        self.regex = regex  # 定義一個正則的轉換器,使用固定的屬性regex,把需要用到的正規表達式傳遞給這個屬性


# 4-2、将自定義的裝換器添加到flask應用中
# app.url_map.converters是一個類字典的東西,裡面存放着所有的轉換器,包括:int,float,path
app.url_map.converters["re"] = RegexConverter


# 4-3、使用自定義的轉換器:使用127.0.0.1/17751770617(這裡需要判斷電話号碼,需要引入正則)
# 路徑根據<re(r'1(3|4|5|7|8)\d{9}'):>去converters裡面找re轉換器,找到以後建立一個執行個體對象,然後根據正規表達式提取<:mobile>裡的内容
@app.route("/send/<re(r'1(3|4|5|7|8)\d{9}'):mobile>")  # 這裡,re是一個類,re()是一個執行個體對象,将正規表達式傳遞給self.regex
def send(mobile):
    return f"send sms to {mobile}"


if __name__ == "__main__":
    print(app.url_map)
    app.run(host="127.0.0.2", debug=True)
           

自定義一個轉換器類,需要繼承BaseConverter類,初始化時需要傳入一個map參數,因為父類中有。

Flask—視圖函數的路由規則設定說明

視圖函數的路由配置,可以在url_map 中檢視

Flask—視圖函數的路由規則設定說明

自定義一個萬能的轉換器

from werkzeug.routing import BaseConverter
from flask import Flask, url_for, redirect

app = Flask(__name__)

class RegexConverter(BaseConverter):
    """
    自定義一個萬能的轉換器
    """
    def __init__(self, url_map, regex):
        super().__init__(url_map)
        self.regex = regex

    def to_python(self, value):
        # 通過轉換器拿到的值并不是直接傳回給視圖函數,而是傳遞給to_python函數,函數對其進行一系列處理後傳回給視圖函數
        print("The 'to_python' is running...")
        return value[:3] + "***" + value[-4:-1]

    def to_url(self, value):
        # 調用url_for的時候調用
        print("The 'to_url' is running...")
        return value


app.url_map.converters["re"] = RegexConverter


@app.route("/send/<re(r'1(3|4|5|7|8|9)\d{9}'):mobile>")
def send_sms(mobile):
    return f"Send message to {mobile}"


# 重定向到send_sms這個視圖,路徑是/send/mobile,是以反向解釋的時候需要傳遞mobile這個參數
@app.route("/index")
def index():
    url = url_for("send_sms", mobile="17751770617")  # 執行RegexConverter裡的to_url方法
    return redirect(url)  # 通路127.0.0.1:5000/send/17751770617,轉換器擷取參數後,傳遞給to_python,然後執行send_sms視圖函數


if __name__ == "__main__":
    app.run()
           
Flask—視圖函數的路由規則設定說明