目錄
- 1. 環境準備
- 2. 安裝依賴
- 3. 修改main.py
- 4. 運行應用
- 5. API使用示例
- 獲取所有任務
- 獲取單個任務
- 創建新任務
- 更新任務
- 刪除任務
- 中文亂碼問題:
下面創建一個簡單的Flask RESTful API示例。首先,我們需要創建環境,安裝必要的依賴,然后修改main.py文件來實現一個基本的RESTful API。
1. 環境準備
uv init
uv venv
source .venv/bin/activate
2. 安裝依賴
uv pip install flask flask-restful
3. 修改main.py
現在,讓我們修改main.py文件,創建一個簡單的RESTful API:
from flask import Flask, request
from flask_restful import Resource, Api, reqparseapp = Flask(__name__)
api = Api(app)# 內存中的任務列表
tasks = {1: {"task": "學習Flask", "done": False},2: {"task": "學習RESTful API", "done": False},3: {"task": "構建項目", "done": False}
}# 任務計數器
task_id_counter = 3# 創建請求解析器
task_parser = reqparse.RequestParser()
task_parser.add_argument('task', type=str, required=True, help='任務內容不能為空')
task_parser.add_argument('done', type=bool, default=False)# 處理單個任務的資源
class Task(Resource):def get(self, task_id):if task_id not in tasks:return {"error": "任務不存在"}, 404return tasks[task_id]def delete(self, task_id):if task_id not in tasks:return {"error": "任務不存在"}, 404del tasks[task_id]return {"message": f"任務 {task_id} 已刪除"}, 200def put(self, task_id):if task_id not in tasks:return {"error": "任務不存在"}, 404args = task_parser.parse_args()tasks[task_id] = {"task": args["task"], "done": args["done"]}return tasks[task_id], 200# 處理任務列表的資源
class TaskList(Resource):def get(self):return tasksdef post(self):global task_id_counterargs = task_parser.parse_args()task_id_counter += 1task_id = task_id_countertasks[task_id] = {"task": args["task"], "done": args["done"]}return tasks[task_id], 201# 注冊API路由
api.add_resource(TaskList, '/tasks')
api.add_resource(Task, '/tasks/<int:task_id>')# 主函數
def main():print("啟動Flask RESTful API服務器...")app.run(debug=True)if __name__ == "__main__":main()
4. 運行應用
現在您可以運行應用:
uv run main.py
5. API使用示例
獲取所有任務
curl http://127.0.0.1:5000/tasks
獲取單個任務
curl http://127.0.0.1:5000/tasks/1
創建新任務
curl -X POST http://127.0.0.1:5000/tasks -H "Content-Type: application/json" -d "{\"task\": \"新任務\", \"done\": false}"
更新任務
curl -X PUT http://127.0.0.1:5000/tasks/1 -H "Content-Type: application/json" -d "{\"task\": \"更新的任務\", \"done\": true}"
刪除任務
curl -X DELETE http://127.0.0.1:5000/tasks/1
中文亂碼問題:
將原文件中的flask_restful\representations\json.py
from __future__ import absolute_import
from flask import make_response, current_app
from flask_restful.utils import PY3
from json import dumpsdef output_json(data, code, headers=None):"""Makes a Flask response with a JSON encoded body"""settings = current_app.config.get('RESTFUL_JSON', {})# If we're in debug mode, and the indent is not set, we set it to a# reasonable value here. Note that this won't override any existing value# that was set. We also set the "sort_keys" value.if current_app.debug:settings.setdefault('indent', 4)settings.setdefault('sort_keys', not PY3)# always end the json dumps with a new line# see https://github.com/mitsuhiko/flask/pull/1262dumped = dumps(data, **settings) + "\n"resp = make_response(dumped, code)resp.headers.extend(headers or {})return resp
改為
from __future__ import absolute_import
from flask import make_response, current_app
from flask_restful.utils import PY3
import jsondef output_json(data, code, headers=None):"""Makes a Flask response with a JSON encoded body"""settings = current_app.config.get('RESTFUL_JSON', {})# 確保不使用ASCII編碼中文字符settings.setdefault('ensure_ascii', False)# 如果在調試模式下,設置縮進和排序鍵if current_app.debug:settings.setdefault('indent', 4)settings.setdefault('sort_keys', True)# 總是以換行符結束JSON輸出# 參見 https://github.com/mitsuhiko/flask/pull/1262dumped = json.dumps(data, **settings) + "\n"resp = make_response(dumped, code)resp.headers.extend(headers or {})# 明確設置內容類型為JSON,并指定UTF-8編碼resp.headers['Content-Type'] = 'application/json; charset=utf-8'return resp