Flask 的 request 對(duì)象
瀏覽器訪問(wèn)服務(wù)端時(shí),向服務(wù)端發(fā)送請(qǐng)求。Flask 程序使用 request 對(duì)象描述請(qǐng)求信息,本小節(jié)介紹 request 對(duì)象的概念,以及它的重要屬性:form 和 args,并對(duì)屬性的使用給出一個(gè)例子。
1. 簡(jiǎn)介
瀏覽器訪問(wèn)服務(wù)端,需要將相應(yīng)的數(shù)據(jù)發(fā)送給服務(wù)端,可能有如下場(chǎng)景:
- 通過(guò) URL 參數(shù)進(jìn)行查詢(xún),瀏覽器需要將查詢(xún)參數(shù)發(fā)送給服務(wù)端
- 提交表單 form 進(jìn)行查詢(xún),瀏覽器需要將表單 form 中的字段發(fā)送給服務(wù)端
- 上傳文件,瀏覽器需要將文件發(fā)送給服務(wù)端
服務(wù)端收到將客戶(hù)端發(fā)送的數(shù)據(jù)后,封裝形成一個(gè)請(qǐng)求對(duì)象,在 Flask 中,請(qǐng)求對(duì)象是一個(gè)模塊變量 flask.request,它包含了如下常用屬性:
屬性 | 說(shuō)明 |
---|---|
method | 當(dāng)前的請(qǐng)求方法 |
form | 表單參數(shù)及其值的字典對(duì)象 |
args | 查詢(xún)字符串的字典對(duì)象 |
values | 包含所有數(shù)據(jù)的字典對(duì)象 |
json | 如果 mimetype 是 application/json,這個(gè)參數(shù)將會(huì)解析 json 數(shù)據(jù),如果不是則返回 None |
headers | http 協(xié)議頭部 |
cookies | cookie 名稱(chēng)和值的字典對(duì)象 |
files | 與上傳文件有關(guān)的數(shù)據(jù) |
假設(shè) URL 等于 http://localhost/query?userId=123,request 對(duì)象中與 URL 參數(shù)相關(guān)的屬性如下:
屬性 | 說(shuō)明 |
---|---|
url | http://localhost/query?userId=123 |
base_url | http://localhost/query |
host | localhost |
host_url | http://localhost/ |
path | /query |
full_path | /query?userId=123 |
2. 獲取 URL 相關(guān)參數(shù)
本節(jié)編寫(xiě)一個(gè) Flask 程序 request-url.py,打印 request 中和 URL 相關(guān)的屬性:
from flask import Flask
from flask import request
app = Flask(__name__)
def echo(key, value):
print('%-10s = %s' % (key, value))
@app.route('/query')
def query():
echo('url', request.url)
echo('base_url', request.base_url)
echo('host', request.host)
echo('host_url', request.host_url)
echo('path', request.path)
echo('full_path', request.full_path)
return 'hello'
if __name__ == '__main__':
app.run(port = 80)
url = http://localhost/query?userId=123
base_url = http://localhost/query
host = localhost
host_url = http://localhost/
path = /query
full_path = /query?userId=123
3. 解析查詢(xún)參數(shù)
request.args 保存了 URL 中的查詢(xún)參數(shù),下面編寫(xiě)一個(gè)例子 request-args.py 解析 URL 中的查詢(xún)參數(shù):
from flask import Flask, request
app = Flask(__name__)
@app.route('/query')
def query():
print('name =', request.args['name'])
print('age =', request.args['age'])
return 'hello'
if __name__ == '__main__':
app.run(debug = True)
在第 4 行,編寫(xiě)路徑 /query 對(duì)應(yīng)的處理函數(shù) query(),打印查詢(xún)參數(shù) name 和 age 的值。在瀏覽器中輸入 URL:http://localhost:5000/query?name=zhangsan&age=13 ,查詢(xún)字符串為 name=zhangsan&age=13,包含有兩個(gè)查詢(xún)參數(shù) name 和 age,F(xiàn)lask 程序在終端輸出如下:
name = zhangsan
age = 13
4. 解析表單參數(shù)
request.form 保存了表單參數(shù),下面編寫(xiě)一個(gè)例子 request-form.py 解析表單參數(shù):
from flask import Flask, request
app = Flask(__name__)
@app.route('/')
def root():
file = open('form.html', encoding = 'utf-8')
return file.read()
@app.route('/addUser', methods = ['POST'])
def check_login():
name = request.form['name']
age = request.form['age']
print('name = %s' % name)
print('age = %s' % age)
return 'addUser OK'
if __name__ == '__main__':
app.run(debug = True)
在第 4 行,編寫(xiě)路徑 / 的處理函數(shù) root(),它讀取文件 form.html,將內(nèi)容返回給瀏覽器。在第 9 行,編寫(xiě)路徑 /addUser 的處理函數(shù) addUser(),打印 request.form 中的參數(shù) name 和 age。
路徑 / 返回 form.html,內(nèi)容如下:
<html>
<body>
<form action="/addUser" method="POST">
<p><input type="text" name="name"/></p>
<p><input type="text" name="age"/></p>
<p><input type="submit" value="submit"/></p>
</form>
</body>
</html>
form.html 中包含一個(gè)表單,action 為 /addUser,method 為 POST,表單中包含有兩個(gè)字段 name 和 age。訪問(wèn) localhost:5000 時(shí),瀏覽器顯示如下:
點(diǎn)擊提交,瀏覽器將請(qǐng)求 /addUser 發(fā)送給服務(wù)端,服務(wù)端在終端打印輸出:
name = zhangsan
age = 50
5. 解析 json 數(shù)據(jù)
編寫(xiě)web api,在寫(xiě) post 請(qǐng)求接口時(shí),通常將接口參數(shù)以 json 格式發(fā)送給服務(wù)端,request.json 保存了請(qǐng)求中的 json 數(shù)據(jù),下面編寫(xiě)一個(gè)例子 request-json.py 解析 json 數(shù)據(jù):
from flask import Flask, request
app = Flask(__name__)
@app.route('/')
def root():
file = open('api.html', encoding = 'utf-8')
return file.read()
@app.route('/api/addUser', methods = ['POST'])
def addUser():
json = request.json
print('JSON', json)
print('name = %s' % json['name'])
print('age = %s' % json['age'])
return 'addUser OK'
if __name__ == '__main__':
app.run(debug = True)
在第 4 行,編寫(xiě)路徑 / 的處理函數(shù) root(),它讀取文件 api.html,將內(nèi)容返回給瀏覽器。在第 9 行,編寫(xiě)路徑 /api/addUser 的處理函數(shù) addUser(),打印 request.json 中的參數(shù) name 和 age,返回給瀏覽器 ‘a(chǎn)ddUser OK’。客戶(hù)端使用 POST 方法提交請(qǐng)求 /api/addUser,在 Flask 中,需要指明 methods 為 ‘POST’。
路徑 / 返回 api.html,api.html 通過(guò) ajax 調(diào)用服務(wù)端的 /api/addUser,內(nèi)容如下:
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.0/jquery.js"></script>
<h1 id='result'>result</h1>
<script>
var data = JSON.stringify({'name':'zhangsan', 'age':'20'});
$.ajax({
url: '/api/addUser',
type: 'post',
contentType:'application/json',
data: data,
success: function(data) {
$("#result").html(data);
},
error: function(e) {
alert('ERROR')
}
});
</script>
在第 2 行,定義 id 為 result 的標(biāo)簽,用于顯示調(diào)用結(jié)果;在第 4 行,設(shè)定 /api/addUser 的接口參數(shù): name 和 age;在第 5 行,通過(guò) jquery.ajax 調(diào)用服務(wù)端的 /api/addUser。請(qǐng)求調(diào)用成功時(shí),回調(diào) success 函數(shù),將結(jié)果顯示在 id 為 result 的標(biāo)簽中,如下所示:
6. 源代碼下載
7. 小結(jié)
本小節(jié)講解了 request 對(duì)象的常見(jiàn)屬性,使用思維導(dǎo)圖總結(jié)如下: