Python用Flask封裝API及調(diào)用詳解
一、Flask的優(yōu)勢
- 輕量級:核心功能簡單,易于學(xué)習(xí)和使用
- 靈活性:可以通過擴(kuò)展添加所需功能
- 易擴(kuò)展性:豐富的擴(kuò)展生態(tài)系統(tǒng)(如Flask-RESTful、Flask-JWT等)
- 開發(fā)效率高:快速原型開發(fā),適合中小型項目
一、基礎(chǔ)設(shè)置
先設(shè)置基本的Flask應(yīng)用結(jié)構(gòu),創(chuàng)建了一個Flask應(yīng)用實例,并定義了一個簡單的業(yè)務(wù)邏輯函數(shù)main(),它接收查詢文本和結(jié)果數(shù)量參數(shù),返回包含這些信息的字典。
from flask import Flask, request, Response, jsonify, abort
import json
app = Flask(__name__)
def main(query, k):
"""業(yè)務(wù)邏輯處理函數(shù)
Args:
query (str): 查詢文本
k (int): 返回結(jié)果數(shù)量
Returns:
dict: 包含查詢參數(shù)和結(jié)果的字典
"""
return {"query": query, "k": k, "status": "success"}
二、GET請求方式
GET請求是最常見的HTTP方法,參數(shù)通過URL傳遞,適合簡單的數(shù)據(jù)查詢。
特點(diǎn)
- 參數(shù)通過URL傳遞(查詢字符串)
- 有長度限制(不同瀏覽器限制不同,通常約2048字符)
- 請求可以被緩存、保留在瀏覽器歷史記錄中
- 不應(yīng)用于敏感數(shù)據(jù)傳輸
服務(wù)端代碼
模擬業(yè)務(wù)邏輯
@app.route('/api/search', methods=['GET'])
def handle_get():
"""處理GET請求
參數(shù)通過URL查詢字符串傳遞:
- query: 必需,字符串類型
- k: 可選,整數(shù)類型,默認(rèn)為1
Returns:
Response: JSON格式的響應(yīng)
"""
# 獲取并驗證參數(shù)
query = request.args.get("query")
if not query:
abort(400, description="query參數(shù)不能為空")
try:
k = int(request.args.get("k", 1)) # 默認(rèn)為1
except ValueError:
abort(400, description="k必須是整數(shù)")
# 調(diào)用業(yè)務(wù)邏輯
result = main(query, k)
# 返回JSON響應(yīng)
return jsonify(result)
客戶端調(diào)用
import requests
# 構(gòu)造URL參數(shù)
params = {
'query': 'Python Flask',
'k': 3
}
# 發(fā)送GET請求
response = requests.get(
url="http://127.0.0.1:8000/api/search",
params=params
)
# 處理響應(yīng)
if response.status_code == 200:
print(response.json())
else:
print(f"請求失敗,狀態(tài)碼: {response.status_code}, 錯誤: {response.text}")
三、POST表單方式
POST表單方式適合傳統(tǒng)的網(wǎng)頁表單提交,數(shù)據(jù)通過HTTP body以application/x-www-form-urlencoded格式傳輸。
特點(diǎn)
- 數(shù)據(jù)通過HTTP body傳輸
- 使用application/x-www-form-urlencoded編碼格式
- 沒有長度限制
- 不會顯示在URL中
- 適合提交敏感數(shù)據(jù)或大量數(shù)據(jù)
服務(wù)端代碼
@app.route('/api/form-submit', methods=['POST'])
def handle_post_form():
"""處理表單POST請求
參數(shù)通過表單數(shù)據(jù)傳遞:
- query: 必需,字符串類型
- k: 可選,整數(shù)類型,默認(rèn)為1
Returns:
Response: JSON格式的響應(yīng)
"""
# 獲取并驗證參數(shù)
query = request.form.get("query")
if not query:
abort(400, description="query參數(shù)不能為空")
try:
k = int(request.form.get("k", 1)) # 默認(rèn)為1
except ValueError:
abort(400, description="k必須是整數(shù)")
# 調(diào)用業(yè)務(wù)邏輯
result = main(query, k)
# 返回JSON響應(yīng)
return jsonify(result)
客戶端調(diào)用
import requests
# 準(zhǔn)備表單數(shù)據(jù)
form_data = {
'query': '表單提交示例',
'k': 2
}
# 發(fā)送POST請求
response = requests.post(
url="http://127.0.0.1:8000/api/form-submit",
data=form_data
)
# 處理響應(yīng)
if response.status_code == 200:
print(response.json())
else:
print(f"請求失敗,狀態(tài)碼: {response.status_code}, 錯誤: {response.text}")
四、POST JSON方式
POST JSON方式是現(xiàn)代API常用的數(shù)據(jù)交換格式,適合傳輸結(jié)構(gòu)化數(shù)據(jù)。
特點(diǎn)
- 數(shù)據(jù)通過HTTP body傳輸
- 使用application/json內(nèi)容類型
- 支持復(fù)雜數(shù)據(jù)結(jié)構(gòu)(嵌套對象、數(shù)組等)
- 是現(xiàn)代Web和移動應(yīng)用的首選方式
- 易于與前端框架(如React、Vue)集成
服務(wù)端代碼
@app.route('/api/json-submit', methods=['POST'])
def handle_post_json():
"""處理JSON POST請求
參數(shù)通過JSON格式傳遞:
- query: 必需,字符串類型
- k: 可選,整數(shù)類型,默認(rèn)為1
Returns:
Response: JSON格式的響應(yīng)
"""
# 驗證請求內(nèi)容類型
if not request.is_json:
abort(415, description="請求必須是JSON格式")
# 獲取JSON數(shù)據(jù)
data = request.get_json()
# 驗證參數(shù)
query = data.get("query")
if not query:
abort(400, description="query參數(shù)不能為空")
try:
k = int(data.get("k", 1)) # 默認(rèn)為1
except ValueError:
abort(400, description="k必須是整數(shù)")
# 調(diào)用業(yè)務(wù)邏輯
result = main(query, k)
# 返回JSON響應(yīng)
return jsonify(result)
客戶端調(diào)用
import requests
# 準(zhǔn)備JSON數(shù)據(jù)
json_data = {
'query': 'JSON數(shù)據(jù)示例',
'k': 4
}
# 發(fā)送POST請求
response = requests.post(
url="http://127.0.0.1:8000/api/json-submit",
json=json_data, # 自動設(shè)置Content-Type為application/json
headers={'Accept': 'application/json'} # 明確要求JSON響應(yīng)
)
# 處理響應(yīng)
if response.status_code == 200:
print(response.json())
else:
print(f"請求失敗,狀態(tài)碼: {response.status_code}, 錯誤: {response.text}")
五、錯誤處理
Flask提供了完善的錯誤處理機(jī)制
@app.errorhandler(400)
def bad_request(error):
return jsonify({
'status': 'error',
'message': error.description
}), 400
@app.errorhandler(404)
def not_found(error):
return jsonify({
'status': 'error',
'message': '資源不存在'
}), 404
@app.errorhandler(415)
def unsupported_media_type(error):
return jsonify({
'status': 'error',
'message': error.description
}), 415
六、對比
| 方式 | 適用場景 | 數(shù)據(jù)位置 | 客戶端調(diào)用方法 | 服務(wù)端獲取方法 |
|---|---|---|---|---|
| GET | 簡單查詢,參數(shù)少 | URL查詢字符串 | requests.get() | request.args |
| POST表單 | 傳統(tǒng)網(wǎng)頁表單提交 | HTTP Body | requests.post(data=) | request.form |
| POST JSON | 現(xiàn)代API,復(fù)雜數(shù)據(jù)結(jié)構(gòu) | HTTP Body | requests.post(json=) | request.get_json() |
實踐建議
- 使用jsonify()代替手動JSON序列化
- 為所有API端點(diǎn)添加前綴(如/api/)
- 實現(xiàn)統(tǒng)一的錯誤處理
- 為每個端點(diǎn)編寫詳細(xì)的文檔字符串
- 在生產(chǎn)環(huán)境使用WSGI服務(wù)器(如Gunicorn)
- 添加適當(dāng)?shù)恼J(rèn)證和限流機(jī)制
七、啟動
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8000, debug=True)
注意:生產(chǎn)環(huán)境不應(yīng)使用debug=True,且應(yīng)通過WSGI服務(wù)器運(yùn)行應(yīng)用。
八、總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
pyautogui自動化控制鼠標(biāo)和鍵盤操作的步驟
這篇文章主要介紹了pyautogui自動化控制鼠標(biāo)和鍵盤操作的步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
Python 運(yùn)行.py文件和交互式運(yùn)行代碼的區(qū)別詳解
這篇文章主要介紹了Python 運(yùn)行.py文件和交互式運(yùn)行代碼的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
從Python的源碼來解析Python下的freeblock
這篇文章主要介紹了從Python的源碼來解析Python下的freeblock,包括內(nèi)存空間分配等知識,需要的朋友可以參考下2015-05-05
Python實現(xiàn)新版正方系統(tǒng)滑動驗證碼識別
這篇文章主要介紹了基于Python實現(xiàn)新版正方系統(tǒng)滑動驗證碼識別算法和方案,文中示例代碼對我們的學(xué)習(xí)和工作有一定的幫助,感興趣的可以了解一下2021-12-12
淺談SciPy中的optimize.minimize實現(xiàn)受限優(yōu)化問題
今天小編就為大家分享一篇淺談SciPy中的optimize.minimize實現(xiàn)受限優(yōu)化問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02

