Flask 的 request 對象
瀏覽器訪問服務(wù)端時,向服務(wù)端發(fā)送請求。Flask 程序使用 request 對象描述請求信息,本小節(jié)介紹 request 對象的概念,以及它的重要屬性:form 和 args,并對屬性的使用給出一個例子。
1. 簡介
瀏覽器訪問服務(wù)端,需要將相應(yīng)的數(shù)據(jù)發(fā)送給服務(wù)端,可能有如下場景:
- 通過 URL 參數(shù)進(jìn)行查詢,瀏覽器需要將查詢參數(shù)發(fā)送給服務(wù)端
- 提交表單 form 進(jìn)行查詢,瀏覽器需要將表單 form 中的字段發(fā)送給服務(wù)端
- 上傳文件,瀏覽器需要將文件發(fā)送給服務(wù)端
服務(wù)端收到將客戶端發(fā)送的數(shù)據(jù)后,封裝形成一個請求對象,在 Flask 中,請求對象是一個模塊變量 flask.request,它包含了如下常用屬性:
屬性 | 說明 |
---|---|
method | 當(dāng)前的請求方法 |
form | 表單參數(shù)及其值的字典對象 |
args | 查詢字符串的字典對象 |
values | 包含所有數(shù)據(jù)的字典對象 |
json | 如果 mimetype 是 application/json,這個參數(shù)將會解析 json 數(shù)據(jù),如果不是則返回 None |
headers | http 協(xié)議頭部 |
cookies | cookie 名稱和值的字典對象 |
files | 與上傳文件有關(guān)的數(shù)據(jù) |
假設(shè) URL 等于 http://localhost/query?userId=123,request 對象中與 URL 參數(shù)相關(guān)的屬性如下:
屬性 | 說明 |
---|---|
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é)編寫一個 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. 解析查詢參數(shù)
request.args 保存了 URL 中的查詢參數(shù),下面編寫一個例子 request-args.py 解析 URL 中的查詢參數(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 行,編寫路徑 /query 對應(yīng)的處理函數(shù) query(),打印查詢參數(shù) name 和 age 的值。在瀏覽器中輸入 URL:http://localhost:5000/query?name=zhangsan&age=13 ,查詢字符串為 name=zhangsan&age=13,包含有兩個查詢參數(shù) name 和 age,F(xiàn)lask 程序在終端輸出如下:
name = zhangsan
age = 13
4. 解析表單參數(shù)
request.form 保存了表單參數(shù),下面編寫一個例子 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 行,編寫路徑 / 的處理函數(shù) root(),它讀取文件 form.html,將內(nèi)容返回給瀏覽器。在第 9 行,編寫路徑 /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 中包含一個表單,action 為 /addUser,method 為 POST,表單中包含有兩個字段 name 和 age。訪問 localhost:5000 時,瀏覽器顯示如下:
點(diǎn)擊提交,瀏覽器將請求 /addUser 發(fā)送給服務(wù)端,服務(wù)端在終端打印輸出:
name = zhangsan
age = 50
5. 解析 json 數(shù)據(jù)
編寫web api,在寫 post 請求接口時,通常將接口參數(shù)以 json 格式發(fā)送給服務(wù)端,request.json 保存了請求中的 json 數(shù)據(jù),下面編寫一個例子 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 行,編寫路徑 / 的處理函數(shù) root(),它讀取文件 api.html,將內(nèi)容返回給瀏覽器。在第 9 行,編寫路徑 /api/addUser 的處理函數(shù) addUser(),打印 request.json 中的參數(shù) name 和 age,返回給瀏覽器 ‘a(chǎn)ddUser OK’??蛻舳耸褂?POST 方法提交請求 /api/addUser,在 Flask 中,需要指明 methods 為 ‘POST’。
路徑 / 返回 api.html,api.html 通過 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 行,通過 jquery.ajax 調(diào)用服務(wù)端的 /api/addUser。請求調(diào)用成功時,回調(diào) success 函數(shù),將結(jié)果顯示在 id 為 result 的標(biāo)簽中,如下所示:
6. 源代碼下載
7. 小結(jié)
本小節(jié)講解了 request 對象的常見屬性,使用思維導(dǎo)圖總結(jié)如下: