Flask RESTful 示例

发布于:2025-06-11 ⋅ 阅读:(19) ⋅ 点赞:(0)

下面创建一个简单的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, reqparse

app = 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": "任务不存在"}, 404
        return tasks[task_id]
    
    def delete(self, task_id):
        if task_id not in tasks:
            return {"error": "任务不存在"}, 404
        del tasks[task_id]
        return {"message": f"任务 {task_id} 已删除"}, 200
    
    def put(self, task_id):
        if task_id not in tasks:
            return {"error": "任务不存在"}, 404
        args = 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 tasks
    
    def post(self):
        global task_id_counter
        args = task_parser.parse_args()
        task_id_counter += 1
        task_id = task_id_counter
        tasks[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 dumps


def 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/1262
    dumped = 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 json

def 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/1262
    dumped = 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