利用flask设计接口
Flask 接口设计详尽指南(整合知识库优化版)
目录
- 基础概念与安装
- 接口设计规范
- 核心功能实现
- 高级特性扩展
- 错误处理与调试
- 部署与优化
- 完整示例
基础概念与安装
安装 Flask
pip install Flask
项目结构建议
my_flask_api/
├── app.py # 主程序入口
├── config.py # 配置文件
├── requirements.txt # 依赖文件
├── static/ # 静态文件
├── templates/ # 模板文件
├── models.py # 数据库模型
├── routes/ # 路由模块(可选)
│ ├── __init__.py
│ ├── auth.py
│ └── users.py
└── utils/ # 工具函数
接口设计规范
RESTful 风格
HTTP 方法 | 资源路径 | 操作描述 |
---|---|---|
GET | /users | 获取用户列表 |
GET | /users/ | 获取单个用户信息 |
POST | /users | 创建用户 |
PUT | /users/ | 更新用户信息 |
DELETE | /users/ | 删除用户 |
URL 设计原则
- 使用复数名词(
/posts
而不是/post
) - 使用嵌套资源(
/users/<id>/posts
) - 显式版本号(
/api/v1/users
)
响应格式规范
{"code": 200,"message": "Success","data": {"id": 1,"name": "John Doe"}
}
核心功能实现
1. 基本接口定义
from flask import Flask, jsonify, requestapp = Flask(__name__)# GET 请求示例
@app.route('/api/greet', methods=['GET'])
def greet():name = request.args.get('name', 'World')return jsonify({'code': 200,'message': f'Hello, {name}!'})# POST 请求示例
@app.route('/api/login', methods=['POST'])
def login():data = request.get_json()username = data.get('username')password = data.get('password')if username == 'admin' and password == '123456':return jsonify({'code': 200,'token': 'fake-jwt-token'})return jsonify({'code': 401,'message': 'Invalid credentials'}), 401
2. 参数处理
路径参数
@app.route('/api/users/<int:user_id>', methods=['GET'])
def get_user(user_id):# 查询用户逻辑return jsonify({'user_id': user_id})
多参数查询
@app.route('/api/users', methods=['GET'])
def search_users():name = request.args.get('name')age = request.args.get('age', type=int)# 查询逻辑return jsonify({'name': name, 'age': age})
3. 文件上传
@app.route('/api/upload', methods=['POST'])
def upload_file():if 'file' not in request.files:return jsonify({'code': 400, 'message': 'No file part'})file = request.files['file']if file.filename == '':return jsonify({'code': 400, 'message': 'No selected file'})# 保存文件file.save(f"uploads/{file.filename}")return jsonify({'code': 200, 'filename': file.filename})
高级特性扩展
1. 蓝图(Blueprints)组织路由
# routes/users.py
from flask import Blueprintbp = Blueprint('users', __name__, url_prefix='/users')@bp.route('/')
def list_users():return jsonify({'users': []})@bp.route('/<int:user_id>')
def get_user(user_id):return jsonify({'user_id': user_id})# app.py
from routes.users import bp
app.register_blueprint(bp)
2. 使用 Flask-RESTful 构建 RESTful API
from flask_restful import Api, Resource, reqparseapi = Api(app)parser = reqparse.RequestParser()
parser.add_argument('name', type=str, required=True)
parser.add_argument('age', type=int)class User(Resource):def get(self, user_id):args = parser.parse_args()return {'user_id': user_id, 'name': args['name']}api.add_resource(User, '/api/users/<int:user_id>')
3. 数据库集成(SQLAlchemy 示例)
from flask_sqlalchemy import SQLAlchemyapp.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
db = SQLAlchemy(app)class User(db.Model):id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(80), unique=True, nullable=False)@app.route('/api/users', methods=['GET'])
def get_users():users = User.query.all()return jsonify([{'id': u.id, 'name': u.name} for u in users])
4. 树形结构数据处理(MySQL 递归 CTE 示例)
-- MySQL 查询生成带层级的树形数据
WITH RECURSIVE menu_tree AS (SELECT id, parent_id, name, 0 AS depth FROM menu WHERE parent_id = 0UNION ALLSELECT m.id, m.parent_id, m.name, mt.depth + 1FROM menu mJOIN menu_tree mt ON m.parent_id = mt.id
)
SELECT id, parent_id, name, depth AS level
FROM menu_tree;
错误处理与调试
1. 全局异常捕获
@app.errorhandler(404)
def not_found(e):return jsonify({'code': 404, 'message': 'Resource not found'}), 404@app.errorhandler(500)
def internal_error(e):app.logger.error('Server Error: %s', e)return jsonify({'code': 500, 'message': 'Internal server error'}), 500
2. 调试模式启动
flask run --debug
3. 使用 assert
进行测试
with app.test_client() as c:rv = c.get('/api/greet?name=John')assert b'Hello, John' in rv.data
部署与优化
1. 生产环境部署方案
# 使用 Gunicorn + Nginx
gunicorn -b 0.0.0.0:8000 app:app# Nginx 配置示例
server {listen 80;server_name example.com;location / {proxy_pass http://127.0.0.1:8000;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}
}
2. 性能优化
- 缓存:使用
Flask-Caching
缓存高频接口 - 异步任务:使用 Celery 处理耗时操作
- 数据库连接池:配置 SQLAlchemy 的
pool_size
3. 安全加固
- 输入验证:使用
marshmallow
或pydantic
- CSRF 保护:启用 Flask-WTF
- HTTPS:部署时强制 HTTPS(通过 Let’s Encrypt)
完整示例:用户管理系统接口
项目结构
user_api/
├── app.py
├── config.py
├── models.py
├── routes/
│ ├── __init__.py
│ └── users.py
└── requirements.txt
代码实现
# app.py
from flask import Flask, jsonify, request
from routes.users import users_bp
from models import dbapp = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'
db.init_app(app)
app.register_blueprint(users_bp)if __name__ == '__main__':with app.app_context():db.create_all()app.run(debug=True)# models.py
from app import dbclass User(db.Model):id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(80), nullable=False)email = db.Column(db.String(120), unique=True, nullable=False)# routes/users.py
from flask import Blueprint, jsonify, request
from models import User, dbusers_bp = Blueprint('users', __name__)@users_bp.route('/', methods=['GET'])
def get_users():users = User.query.all()return jsonify([{'id': u.id, 'name': u.name, 'email': u.email} for u in users])@users_bp.route('/', methods=['POST'])
def create_user():data = request.get_json()new_user = User(name=data['name'], email=data['email'])db.session.add(new_user)db.session.commit()return jsonify({'id': new_user.id, 'name': new_user.name}), 201@users_bp.route('/<int:user_id>', methods=['GET'])
def get_user(user_id):user = User.query.get_or_404(user_id)return jsonify({'id': user.id, 'name': user.name, 'email': user.email})@users_bp.route('/<int:user_id>', methods=['PUT'])
def update_user(user_id):user = User.query.get_or_404(user_id)data = request.get_json()user.name = data.get('name', user.name)user.email = data.get('email', user.email)db.session.commit()return jsonify({'id': user.id, 'name': user.name, 'email': user.email})@users_bp.route('/<int:user_id>', methods=['DELETE'])
def delete_user(user_id):user = User.query.get_or_404(user_id)db.session.delete(user)db.session.commit()return jsonify({'message': 'User deleted'})
测试接口
# 创建用户
curl -X POST http://localhost:5000/api/users \-H "Content-Type: application/json" \-d '{"name": "Alice", "email": "alice@example.com"}'# 获取用户列表
curl http://localhost:5000/api/users# 获取单个用户
curl http://localhost:5000/api/users/1# 更新用户
curl -X PUT http://localhost:5000/api/users/1 \-H "Content-Type: application/json" \-d '{"name": "Alice Smith"}'# 删除用户
curl -X DELETE http://localhost:5000/api/users/1
常见问题与解决方案
1. 跨域问题(CORS)
from flask_cors import CORS
CORS(app)
2. 接口性能瓶颈
- 数据库优化:添加索引、减少查询次数
- 缓存高频数据:使用 Redis 缓存结果
- 异步处理:将耗时操作放入消息队列
3. 日志记录
import logging
logging.basicConfig(filename='app.log', level=logging.INFO)@app.before_request
def log_request_info():app.logger.info('Request: %s %s', request.method, request.path)
扩展实践:Flask-RESTX 与 Swagger 文档
安装 Flask-RESTX
pip install flask-restx
示例代码
from flask_restx import Api, Resource, fieldsapi = Api(app, version='1.0', title='Sample API')ns = api.namespace('auth', description='Authentication operations')user_model = api.model('User', {'username': fields.String(required=True),'password': fields.String(required=True)
})@ns.route('/login')
class Login(Resource):@ns.expect(user_model)def post(self):data = request.get_json()if data['username'] == 'admin':return {'token': 'fake-token'}, 200return {'message': 'Invalid credentials'}, 401
相关文章:
利用flask设计接口
Flask 接口设计详尽指南(整合知识库优化版) 目录 基础概念与安装接口设计规范核心功能实现高级特性扩展错误处理与调试部署与优化完整示例 基础概念与安装 安装 Flask pip install Flask项目结构建议 my_flask_api/ ├── app.py # 主…...

ideal创建Springboot项目(Maven,yml)
以下是使用 IntelliJ IDEA 创建基于 Maven 的 Spring Boot 项目并使用 YAML 配置文件的详细步骤: 一、创建 Spring Boot 项目 启动项目创建向导 打开 IntelliJ IDEA,点击“File”->“New”->“Project”。 在弹出的“New Project”窗口中&#…...

Pycharm(十九)深度学习
一、深度学习概述 1.1 什么是深度学习 深度学习是机器学习中的一种特殊方法,它使用称为神经网络的复杂结构,特别是“深层”的神经网络,来学习和做出预测。深度学习特别适合处理大规模和高维度的数据,如图像、声音和文本。深度学习、机器学习和人工智能之间的关系如下图所…...
XSS 攻击:深入剖析“暗藏在网页中的脚本“与防御之道
XSS (Cross-Site Scripting),即跨站脚本攻击,是 Web 安全领域中最常见也最具危害性的漏洞之一。攻击者通过巧妙的手段将恶意的 JavaScript、HTML 或其他脚本代码注入到正常的 Web 页面中。当其他用户浏览这些被注入了恶意脚本的页面时,这些脚…...

Scrapyd 详解:分布式爬虫部署与管理利器
Scrapyd 是 Scrapy 官方提供的爬虫部署与管理平台,支持分布式爬虫部署、定时任务调度、远程管理爬虫等功能。本文将深入讲解 Scrapyd 的核心功能、安装配置、爬虫部署流程、API 接口使用,以及如何结合 Scrapy-Redis 实现分布式爬虫管理。通过本文&#x…...
ai之pdf解析rapidOCR 的两种底层依赖PaddlePaddle 和ONNXRuntime
rapidocr_onnxruntime 与 rapidocr(通常指 rapidocr_paddle 或其他后端实现)的核心区别及使用推荐: 一、核心区别 特性rapidocr_onnxruntimerapidocr(以 rapidocr_paddle 为例)后端引擎基于 ONNXRuntime 推理框架&…...

驱动开发硬核特训 · 专题篇:Vivante GPU 与 DRM 图形显示体系全解析(i.MX8MP 平台实战)
视频教程请关注 B 站:“嵌入式Jerry”。 一、背景导读:GPU 与 DRM 到底谁负责“显示”? 在嵌入式 Linux 图形系统中,“画面怎么显示出来”的问题,表面看似简单,实则涉及多个内核子系统与用户态组件的协同&…...

C——猜数字游戏
前面我们已经学习了C语言常见概念,数据类型和变量以及分置于循环的内容,现在我们可以将这些内容结合起来写一个有趣的小游戏。下面正式开始我们今天的主题——猜数字游戏的实现。 猜数字游戏的要求: 1.电脑自动生成1~100的随机数。 2.玩家…...

C/C++实践(三)深入理解 C++ 三大特性之一:封装
一、封装的概念与核心思想 封装(Encencapsulation)是 C 面向对象编程(OOP)的三大核心特性之一,其本质是将数据(成员变量)和对数据的操作(成员函数)捆绑在一个逻辑单元&a…...
Filecoin存储管理:如何停止Lotus向特定存储路径写入新扇区数据
Filecoin存储管理:如何停止Lotus向特定存储路径写入新扇区数据 引言背景问题场景解决方案步骤1:修改sectorstore.json文件步骤2:重新加载存储配置步骤3:验证更改 技术原理替代方案最佳实践结论 引言 在Filecoin挖矿过程中&#x…...

1、RocketMQ 核心架构拆解
1. 为什么要使用消息队列? 消息队列(MQ)是分布式系统中不可或缺的中间件,主要解决系统间的解耦、异步和削峰填谷问题。 解耦:生产者和消费者通过消息队列通信,彼此无需直接依赖,极大提升系统灵…...

vue3 element-plus 输入框回车跳转页面问题处理
问题描述: 当页面搜索条件只有一个的情况下,输入框不管有没有值,回车后会跳转页面 解决办法,给表单添加 submit.prevent <el-form ref"ruleForm" :model"search" label-width"120px" class&qu…...
常见WEB漏洞----暴力破解
什么是暴力破解 暴力破解 (Brue Force) 是一种攻击方法 (穷举法),简称为“爆破”,黑客通过反复猜解和实验,旨在以暴力手段登入、访问目标主机获取服务,破坏系统安全,其属于 ATT&CK技术中的一种,常利用…...

快速入门深度学习系列(2)----损失函数、逻辑回归、向量化
针对深度学习入门新手目标不明确 知识体系杂乱的问题 拟开启快速入门深度学习系列文章的创作 旨在帮助大家快速的入门深度学习 写在前面: 本系列按照吴恩达系列课程顺序发布(说明一下为什么不直接看原笔记 因为内容太多 没有大量时间去阅读 所有作者需要一次梳理…...

[超详细,推荐!!!]前端性能优化策略详解
学习记录,部分内容版权归妙码学院 1.优化内容包括那些 其实前端的优化,整体粗略概括下来,白话之: 打开速度怎么变快再次打开速度怎么变快操作怎么才顺滑动画怎么保证流畅 2.性能优化 2.1首屏加载优化 在了解优化方法和策略之…...

数据提取之BeautifulSoup4快速使用
文章目录 一、前言二、概述2.1 安装2.2 初始化2.3 对象类型 三、遍历文档树3.1 子节点3.2 父节点3.3 兄弟节点3.4 前后节点3.5 节点内容3.5.1 文本内容3.5.2 属性值3.5.3 标签删除 四、搜索文档树4.1 find_all4.2 find4.3 CSS选择器4.4 更多 一、前言 官方文档:http…...

list类的详细讲解
【本节目标】 1. list的介绍及使用 2. list的深度剖析及模拟实现 3. list与vector的对比 1. list的介绍及使用 1.1 list的介绍 1. list 是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。 2. list 的底层是双向链表结构&a…...

Linux系统下安装mongodb
1. 配置MongoDB的yum仓库 创建仓库文件 sudo vi /etc/yum.repos.d/mongodb-org.repo添加仓库配置 根据系统版本选择配置(以下示例为CentOS 7和CentOS 9的配置): CentOS 7(安装MongoDB 5.0/4.2等旧版本): In…...

kuka, fanuc, abb机器人和移动相机的标定
基础知识 : 一, 9点标定之固定相机标定: 图1: 固定位置相机拍照 因为相机和机器人的基坐标系是固定的, 所以在海康威视相机的9点标定功能栏中, 填上海康使用“圆查找”捕捉到的坐标值, 再将机器人显示的工具坐标系在基坐标系的实时位置pos_act值填入物理坐标X, Y中即可 图2:…...

Android Framework学习四:init进程实现
文章目录 init流程简介init源码执行顺序执行顺序 init进程的具体工作事项挂载文件系统设置 SELinuxSecondStageMaininit.rc启动zygote和serviceManager进程的重要性serviceManager工作原理 Framework学习之系列文章 init流程简介 下面图片主要围绕 Android 系统中init进程的运…...
Linux计划任务与进程
at 命令使用方法 at 命令可在指定时间执行任务,适用于一次性任务调度。以下是基本用法: 安装 atd 服务(如未安装) # Debian/Ubuntu sudo apt-get install at# CentOS/RHEL sudo yum install at启动服务 sudo systemctl start atd…...

Java引用RabbitMQ快速入门
这里写目录 Java发送消息给MQ消费者接收消息实现一个队列绑定多个消费者消息推送限制 Fanout交换机路由的作用Direct交换机使用案例 Topic交换机声明队列和交换机的方式MQ消息转换器业务改造生产者可靠性设置重连 系统可靠性 Java发送消息给MQ public void testSendMessage() t…...

用R语言+随机森林玩转遥感空间预测-基于R语言机器学习遥感数据处理与模型空间预测技术及实际项目案例分析
遥感数据具有高维度、非线性及空间异质性等特点,传统分析方法往往难以充分挖掘其信息价值。机器学习技术的引入为遥感数据处理与模型预测提供了新的解决方案,其中随机森林(Random Forest)以其优异的性能和灵活性成为研究者的首选工…...
【许可证】Open Source Licenses
长期更新 扩展:shield.io装饰 开源许可证(Open Source Licenses)有很多种,每种都有不同的授权和限制,适用于不同目的。 默认的ISC🟰MIT License是否可商用是否要求开源衍生项目是否必须署名是否有专利授权…...

Spring Boot 文件上传实现详解
在项目开发过程中,文件上传是极为常见的功能需求。对于熟悉 Spring MVC 文件上传操作的开发者而言,Spring Boot 中的文件上传与之原理基本相通,只是在依赖管理和配置方式上更为简化。接下来,将详细阐述 Spring Boot 项目中文件上传…...

查看单元测试覆盖率
文章目录 1、POM文件配置2、编写单元测试3、执行单元测试4、查看单元测试覆盖率 1、POM文件配置 pom文件配置jacoco插件 <!-- 生成JaCoCo覆盖率数据插件 --> <plugin><groupId>org.jacoco</groupId><artifactId>jacoco-maven-plugin</artif…...

基于SpringBoot的在线教育管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
交叉编译 opencv-4.10
编译说明 opencv 下包含很多模块,各个模块的作用可以参考Opencv—模块概览. 嵌入式考虑有限存储等因素会对模块进行裁剪,我这里主要保留图像拼接(stitching)图片编解码(imgcodecs)与特征点匹配(…...

C# 方法(方法重载)
本章内容: 方法的结构 方法体内部的代码执行 局部变量 局部常量 控制流 方法调用 返回值 返回语句和void方法 局部函数 参数 值参数 引用参数 引用类型作为值参数和引用参数 输出参数 参数数组 参数类型总结 方法重载 命名参数 可选参数 栈帧 递归 方法重载 一个类中可以有多个…...

3、食品包装控制系统 - /自动化与控制组件/food-packaging-control
76个工业组件库示例汇总 食品包装线控制系统 这是一个用于食品包装线控制系统的自定义组件,提供了食品包装生产线的可视化监控与控制界面。组件采用工业风格设计,包含生产流程控制、实时数据监控和逻辑编程三个主要功能区域。 功能特点 工业风格UI设…...