1、Flask中的request
在Python發送Post、Get等請求時,我們使用到requests庫。Flask中有一個request庫,有其特有的一些方法和屬性,注意跟requests不是同一個。
2、Post請求:request.get_data()
用于服務端獲取客戶端請求數據。注意:是未經任何處理的原始數據而不管內容類型,如果數據時json的,則取得是json字符串,排序和請求參數一致。
2.1 Flask代碼
不同方法的示例僅需要更換視圖函數,后續僅展示視圖函數。
# 注意:flask中的request和requests庫不是同一個,要區分開
from flask import Flask, request# 創建一個flask實例
app = Flask(__name__)# 視圖函數,只允許get和post請求
@app.route('/', methods=['GET', 'POST'])
def request_flask():# 獲取未經處理過的原始數據而不管內容類型,如果數據格式是json的# 則取得是json字符串,排序和請求參數一致data = request.get_data()print(data)print(type(data))return 'hello world'if __name__ == '__main__':app.run()
2.2 測試代碼(一直應用于后續章節,不再贅述)
import requestsdata = {"username": "cc","password": "123456"
}url = "http://127.0.0.1:5000/"
resp = requests.post(url=url, json=data)
print('post:', resp)
print('post:', resp.text)resp = requests.get(url=url, params=data)
print('get:', resp)
print('get:', resp.text)
2.3 執行效果
2.3.1 Flask
get.data()獲取到的請求數據是字節流,排序和請求參數一致。
2.3.2 請求結果
get和post請求都成功了。
3、Post請求:request.data
獲取到的也是未經處理的原始數據,如果數據格式是json的,則取得是json字符串,排序和請求參數一致。request.get_data()效果一樣
4、Post請求:request.get_json()
將請求參數做了處理,得到字典格式,因此排序會打亂,依據字典排序規則。
4.1 Flask代碼
# 視圖函數,只允許get和post請求
@app.route('/', methods=['GET', 'POST'])
def request_flask():# 將請求參數做了處理,得到字典格式,因此排序會打亂,依據字典排序規則。data = request.get_json()print(data)print(type(data))# 服務端就可以根據字典進行取值username = request.get_json()["username"]print(username)return 'hello world'
4.2 執行效果
4.2.1 Flask
將請求參數做了處理,得到字典格式,方便服務端按鍵取值,提取到username是“cc”。
注意:get請求是沒有字典的,不能夠取值,運行時可以注釋掉get方法。
4.2.2 請求結果
post請求成功。
5、Post請求:request.json
跟request.get_json()效果相同。得到的是字典格式的,因此排序會打亂,依據字典排序規則。
代碼如下:
# 視圖函數,只允許get和post請求
@app.route('/', methods=['GET', 'POST'])
def request_flask():# 將請求參數做了處理,得到的是字典格式的,因此排序會打亂,依據字典排序規則data = request.jsonprint(data)print(type(data))# 如果這里的key服務端寫錯了,客戶端請求時,就會出現500username = request.json['username']print(username)return 'hello world'
6、Get請求:request.args.get()
6.1 Flask代碼
# 視圖函數,只允許get和post請求
@app.route('/', methods=['GET', 'POST'])
def request_flask():# 可以獲取單個的值username = request.args.get("username")print(username)return 'hello world'
6.2 執行結果
服務端拿到了username的值“cc”
7、Get請求:request.args.to_dict()
7.1 Flask代碼
# 視圖函數,只允許get和post請求
@app.route('/', methods=['GET', 'POST'])
def request_flask():# 可以獲取get請求的所有參數,返回值是ImmutableMutiDict(不可變的多字典)類型i = request.argsprint(i)# 將獲得的參數轉化成字典j = i.to_dict()print(j)print(type(j))print(j["username"])return 'hello world'
7.2 執行結果
8、模擬請求報錯
8.1 500 Internal Server Error
當服務端key寫錯時,就會報500錯誤,例如可以把key username改成usename,運行后看下效果。
8.2 404 Not Found
僅創建了實例,并沒有視圖函數,啟動socket服務后,訪問地址就會報404。或者請求url填寫錯誤。
from flask import Flask# 創建一個flask實例
app = Flask(__name__)if __name__ == '__main__':app.run()