当前位置: 首页 > ops >正文

Flask RESTful 示例

目录

    • 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
http://www.xdnf.cn/news/13131.html

相关文章:

  • 增加Label Verified
  • 《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
  • 机器学习sklearn |(逻辑回归)求解器(Solver) :优化算法的实现,用于寻找模型参数的最优解
  • Spring boot应用监控集成
  • 鹰盾播放器:安全与用户体验的精妙平衡
  • 互联网大数据求职面试:从Zookeeper到数据挖掘的技术探讨
  • 基于服务器使用 apt 安装、配置 Nginx
  • 熵最小化Entropy Minimization (二): 案例实施
  • 使用 VSCode 开发 FastAPI 项目(1)
  • 从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
  • 云打包生成的ipa上传构建版本经验分享
  • 游戏测试面试八股汇总(持续更新版)
  • dbeaver 查询clickhouse,数据库时间差了8小时
  • UDP(Echoserver)
  • linux之kylin系统nginx的安装
  • 第二部分-IP及子网划分
  • BERT 位置嵌入机制与代码解析
  • Ubuntu 24.04 LTS 长期支持版发布:对服务器用户意味着什么?新特性、升级建议与性能影响初探
  • AWS S3 SDK FOR JAVA 基本使用及如何兼容七牛云
  • [Java基础] stream流中Collectors.toMap报空指针异常情况
  • CppCon 2015 学习:Time Programming Fundamentals
  • Shooter–System Performance Variability as a Function of Recoil Dynamics
  • 一般视频剪辑的硬盘配置是什么
  • AUTOSAR图解==>AUTOSAR_AP_RS_General
  • 卷积核、FIR滤波器与LTI系统——一回事
  • 高斯列主元消去法——python实现
  • Android Jetpack 系列(三) Lifecycle 生命周期感知组件详解
  • cacert.pem根证书文件
  • PydanticAI 作为 MCP 客户端示例
  • RK3568/RK3588 KVM系统虚拟化解决方案