獲取POST方法傳送的數(shù)據(jù)
作為一種HTTP請求方法,POST用于向指定的資源提交要被處理的數(shù)據(jù)。
比如: 我們在某網(wǎng)站注冊用戶、寫文章等時(shí)候,需要將數(shù)據(jù)傳遞到網(wǎng)站服務(wù)器中。并不適合將數(shù)據(jù)放到URL參數(shù)中,密碼放到URL參數(shù)中容易被看到,文章數(shù)據(jù)又太多,瀏覽器不一定支持太長長度的URL。這時(shí),一般使用POST方法。
本課程使用python的requests庫模擬瀏覽器。
安裝方法:
pip install requests
看POST數(shù)據(jù)內(nèi)容
以用戶注冊為例子,我們需要向服務(wù)器/register傳送用戶名name和密碼password。如下編寫server.py。
from flask import Flask, request
app = Flask(__name__)
@app.route('/register', methods=['POST'])
def register():
? ? print(request.headers)
? ? print(request.stream.read())
? ? return 'welcome'
if __name__ == '__main__':
? ? app.run(port=5000, debug=True)
@app.route('/register', methods=['POST'])是指url/register只接受POST方法。可以根據(jù)需要修改methods參數(shù),例如如果想要讓它同時(shí)支持GET和POST,這樣寫:
@app.route('/register', methods=['GET', 'POST'])
瀏覽器模擬工具client.py內(nèi)容如下:
import requests
user_info = {'name': 'Loen', 'password': 'loveyou'}
r = requests.post("http://127.0.0.1:5000/register", data=user_info)
print(r.text)
運(yùn)行server.py,然后運(yùn)行client.py。client.py將輸出:
welcome
而server.py在終端中輸出以下調(diào)試信息(通過print輸出):

前6行是client.py生成的HTTP請求頭,由print(request.headers)輸出。
請求體的數(shù)據(jù),我們通過print(request.stream.read())輸出,結(jié)果是:
b'name=Loen&password=loveyou'
解析POST數(shù)據(jù)
上面,我們看到post的數(shù)據(jù)內(nèi)容是:
b'name=Loen&password=loveyou'
我們要想辦法把我們要的name、password提取出來,怎么做呢?
Flask已經(jīng)內(nèi)置了解析器request.form。
我們將服務(wù)代碼改成:
from flask import Flask, request
app = Flask(__name__)
@app.route('/register', methods=['POST'])
def register():
? ? print(request.headers)
? ? # print(request.stream.read()) # 不要用,否則下面的form取不到數(shù)據(jù)
? ? print(request.form)
? ? print(request.form['name'])
? ? print(request.form.get('name'))
? ? print(request.form.getlist('name'))
? ? print(request.form.get('nickname', default='little apple'))
? ? return 'welcome'
if __name__ == '__main__':
? ? app.run(port=5000, debug=True)
執(zhí)行client.py請求數(shù)據(jù),服務(wù)器代碼會在終端輸出:

request.form會自動解析數(shù)據(jù)。
request.form['name']和request.form.get('name')都可以獲取name對應(yīng)的值。對于request.form.get()可以為參數(shù)default指定值以作為默認(rèn)值。所以:
print(request.form.get('nickname', default='little apple'))
輸出的是默認(rèn)值
little apple
獲取POST中的列表數(shù)據(jù)
如果name有多個(gè)值,可以使用request.form.getlist('name'),該方法將返回一個(gè)列表。我們將client.py改一下:
import requests
user_info = {'name': ['Loen', 'Alan'], 'password': 'loveyou'}
r = requests.post("http://127.0.0.1:5000/register", data=user_info)
print(r.text)
此時(shí)運(yùn)行client.py,print(request.form.getlist('name'))將輸出:
[u'Loen', u'Alan']