上一篇中已經講述了:HTTP協議向服務器傳參有幾種途徑{ 鏈接 }
在Flask中同樣通過這4中傳參途徑進行歸納:
1. URL中路徑參數的獲取:
拓展:
- # 路由參數/路徑參數:http://127.0.0.1:5000/users/13312345678
- # 路由查詢參數:http://127.0.0.1:5000/users/?mobile=13312345678&?user_name="yd"
1.1 是什么?
Flask不同於Django直接在定義路由時編寫正則表達式的方式,而是采用轉換器;
1.2 怎么用?
-
-
2.作用:提取URL路徑參數
-
3.效果:將該位置數據以
字符串格式
匹配,值同樣為字符串
類型,轉換器中的值為參數名傳入視圖
# 127.0.0.1/user/123
@app.route('/users/<user_id>') def user_info(user_id): print(type(user_id)) return 'hello user {}'.format(user_id)
DEFAULT_CONVERTERS = { "default": UnicodeConverter, "string": UnicodeConverter, "any": AnyConverter, "path": PathConverter, "int": IntegerConverter, "float": FloatConverter, "uuid": UUIDConverter, }
http://127.0.0.1:5000/users/4/2/3 # @app.route('/users/<path:user_id>') # user_id=4/2/3 @app.route('/users/<string:user_id>') # 找不到 http://127.0.0.1:5000/users/4 # 只能匹配到/users/ 斜線后面部分 # user_id=4 # string匹配的轉換器所在位置的數據,不帶斜線 # path配置轉換器所在位置的數據,包括(除# ?之外的所有符號【包括中引文不同狀態】)
- 8.自定義轉換器
-
內置轉換器不滿足需求時,自定義匹配
-
8.2怎么做?
參考源碼實現
#app文件導包routing中的map類,app.py中類屬性 = routing中的 map類, map類屬性:self.converters = self.default_converters.copy() 。。。
-
8.3實現步驟:
-
定義類
-
繼承BaseConverter
-
定義正則表達式
-
把自定義轉換器,添加到默認轉換字典中
-
8.4案例:
# 個人練習:匹配學號--2015100446 class StuIdConverter(BaseConverter): regex = "20[0-5]{2}100\d[0-9]{2}" # 添加自定義轉換器到默認轉換器字典中 app.url_map.converters['stu_id'] = StuIdConverter @app.route('/<stu_id:data>') def get_stu_id(data): print("stu_id={}".format(data)) return 'stu_id value is stu_id={}'.format(data)
2.查詢參數,請求頭,請求體
使用請求上下文對象request獲取
屬性 | 說明 | 類型 |
---|---|---|
data | 記錄請求的數據,並轉換為字符串 | * |
form | 記錄請求中的表單數據 | MultiDict |
args | 記錄請求中的查詢參數 | MultiDict |
cookies | 記錄請求中的cookie信息 | Dict |
headers | 記錄請求中的報文頭 | EnvironHeaders |
method | 記錄請求使用的HTTP方法 | GET/POST |
url | 記錄請求的URL地址 | string |
files | 記錄請求上傳的文件 | * |
案例:
# 訪問127.0.0.1:5000/?name=yd,獲取name值 from flask import request app = Flask(__name__) @app.route("/") def index(): name = request.args.get("name") return "請求參數:{}".format(name) if __name__ == "__main__": app.run()
#上傳圖片
from flask import Flast, request
app = Flask(__name__)
@app.route("/img", methods=["POST"])
def up_load():
image = request.file.get("image")
image.save("./new_image.jpg")
if __name__ == "__main__":
app.run()
# 注釋
1. 客戶端發圖片是post請求,而Flask默認是GET請求,所以我們需要指明請求方式是POST
2. 通過request.file.get("image")獲取到前端上傳的文件,我們直接用image接受,image此時是一個對象,我們可以直接用image.save()方法保存。保存時需要指定存儲路徑和文件名。
3. 注意坑:
-
-
method:get請求方式也能提交
form表單