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)
路由設定
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參數,因為父類中有。
視圖函數的路由配置,可以在url_map 中檢視
自定義一個萬能的轉換器
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()