獲取POST數(shù)據(jù)

獲取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']

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容