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ù)查詢。
特點
- 參數(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格式傳輸。
特點
- 數(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ù)。
特點
- 數(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端點添加前綴(如/api/)
- 實現(xiàn)統(tǒng)一的錯誤處理
- 為每個端點編寫詳細(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īng)用。
八、總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
PyTorch中torch.manual_seed()的用法實例詳解
在Pytorch中可以通過相關(guān)隨機(jī)數(shù)來生成張量,并且可以指定生成隨機(jī)數(shù)的分布函數(shù)等,下面這篇文章主要給大家介紹了關(guān)于PyTorch中torch.manual_seed()用法的相關(guān)資料,需要的朋友可以參考下2022-06-06
Pandas如何將Timestamp轉(zhuǎn)為datetime類型
這篇文章主要介紹了Pandas如何將Timestamp轉(zhuǎn)為datetime類型,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07
2026年最值得投入學(xué)習(xí)的PythonAI框架top10排行榜
本文推薦了2026年最值得投入學(xué)習(xí)的PythonAI框架,從Num社區(qū)活躍度、生產(chǎn)就就緒度、學(xué)習(xí)曲線和前景指數(shù)四個維度綜合評分,這些框架適用于不同從數(shù)據(jù)分析師到企業(yè)AI應(yīng)用工程師的各種角色2026-04-04
python 利用opencv實現(xiàn)圖像網(wǎng)絡(luò)傳輸
這篇文章主要介紹了python 如何利用opencv實現(xiàn)圖像網(wǎng)絡(luò)傳輸,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-11-11
5個快速上手的Python PyBlueZ藍(lán)牙開發(fā)技巧分享
PyBlueZ作為Python藍(lán)牙編程的重要工具,為開發(fā)者提供了簡單高效的藍(lán)牙通信解決方案,本文將從實際應(yīng)用角度出發(fā),分享5個實用的開發(fā)技巧,幫助你快速掌握Python藍(lán)牙編程,希望對大家有所幫助2026-01-01
PyQt5入門之基于QListWidget版本實現(xiàn)圖片縮略圖列表功能
這篇文章主要介紹了PyQt5入門之基于QListWidget版本實現(xiàn)圖片縮略圖列表功能,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09

