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

python Flask简单图书管理 API

实现了一个基于 Flask 框架的简单图书管理 API,主要功能包括:

  • 用户登录认证(硬编码管理员账户)
  • 图书信息的 CRUD(创建、读取、更新、删除)操作
  • 使用 SQLite 数据库存储用户和图书信息
  • 基于会话的身份验证机制

依赖组件

  • Flask:Web 框架
  • Flask-SQLAlchemy:ORM 数据库工具
  • Flask-CORS:处理跨域请求
  • functools.wraps:装饰器工具

主要模块

  1. 应用初始化:创建 Flask 应用,配置 CORS,设置密钥
  2. 数据库配置:SQLite 数据库连接,SQLAlchemy 初始化
  3. 数据模型:定义 User 和 Book 两个数据库模型
  4. 数据库初始化:创建表结构,添加默认管理员用户
  5. 认证装饰器:实现登录状态检查
  6. API 端点:提供用户认证和图书管理的 RESTful 接口
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# 文件名:apisj.py
# 作者:Administrator
# 日期:2025/8/8
# 描述:
from flask import Flask, request, jsonify, session
from flask_sqlalchemy import SQLAlchemy
from flask_cors import CORS
from functools import wraps
import osapp = Flask(__name__)
CORS(app)# 生产环境请换成安全随机值
app.secret_key = "secret_key_for_session"# SQLite 数据库配置
BASE_DIR = os.path.abspath(os.path.dirname(__file__))
db_path = os.path.join(BASE_DIR, "books.db")
app.config["SQLALCHEMY_DATABASE_URI"] = f"sqlite:///{db_path}"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = Falsedb = SQLAlchemy(app)# -------------------
# 数据模型
# -------------------
class User(db.Model):id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(50), unique=True, nullable=False)password = db.Column(db.String(50), nullable=False)class Book(db.Model):id = db.Column(db.Integer, primary_key=True)title = db.Column(db.String(100), nullable=False)author = db.Column(db.String(50), nullable=False)# 初始化数据库
with app.app_context():db.create_all()# 如果没有用户就创建默认管理员if not User.query.filter_by(username="admin").first():db.session.add(User(username="admin", password="123456"))db.session.commit()# -------------------
# 登录态检查装饰器
# -------------------
def login_required(func):@wraps(func)def wrapper(*args, **kwargs):if not session.get("logged_in"):return jsonify({"error": "未登录"}), 401return func(*args, **kwargs)return wrapper# -------------------
# 登录
# -------------------
@app.route("/login", methods=["POST"])
def login():data = request.get_json()username = data.get("username")password = data.get("password")user = User.query.filter_by(username=username, password=password).first()if user:session["logged_in"] = Truesession["username"] = usernamereturn jsonify({"message": "登录成功"})return jsonify({"error": "用户名或密码错误"}), 401# -------------------
# 登出
# -------------------
@app.route("/logout", methods=["POST"])
@login_required
def logout():session.clear()return jsonify({"message": "已登出"})# -------------------
# 获取书籍列表
# -------------------
@app.route("/books", methods=["GET"])
@login_required
def get_books():books = Book.query.all()return jsonify([{"id": b.id, "title": b.title, "author": b.author} for b in books])# -------------------
# 新增书籍
# -------------------
@app.route("/books", methods=["POST"])
@login_required
def add_book():data = request.get_json()new_book = Book(title=data.get("title"), author=data.get("author"))db.session.add(new_book)db.session.commit()return jsonify({"message": "书籍添加成功", "book": {"id": new_book.id, "title": new_book.title, "author": new_book.author}})# -------------------
# 更新书籍
# -------------------
@app.route("/books/<int:book_id>", methods=["PUT"])
@login_required
def update_book(book_id):data = request.get_json()book = Book.query.get(book_id)if not book:return jsonify({"error": "书籍不存在"}), 404book.title = data.get("title", book.title)book.author = data.get("author", book.author)db.session.commit()return jsonify({"message": "书籍更新成功", "book": {"id": book.id, "title": book.title, "author": book.author}})# -------------------
# 删除书籍
# -------------------
@app.route("/books/<int:book_id>", methods=["DELETE"])
@login_required
def delete_book(book_id):book = Book.query.get(book_id)if not book:return jsonify({"error": "书籍不存在"}), 404db.session.delete(book)db.session.commit()return jsonify({"message": "书籍删除成功"})if __name__ == "__main__":app.run(debug=True)

http://www.dtcms.com/a/324260.html

相关文章:

  • 【Linux知识】Linux grep 命令全面使用指南
  • 祝融号无线电工作频段
  • C++入门自学Day8-- 初识Vector
  • leetcode2379:得到K个黑块的最少涂色次数(定长滑动窗口)
  • 2.变量和常量
  • Go 工具链环境变量实战:从“command not found”到工具全局可用的全流程复盘
  • 【数据结构入门】栈和队列的OJ题
  • 二维前缀和问题
  • MySQL面试题及详细答案 155道(041-060)
  • 构建第三方软件仓库
  • 数据类型取值范围
  • String AOP、事务、缓存
  • 【18】OpenCV C++实战篇——【项目实战】OpenCV C++ 精准定位“十字刻度尺”中心坐标,过滤图片中的干扰,精准获取十字交点坐标
  • 力扣559:N叉树的最大深度
  • XGBoost算法在机器学习中的实现
  • C语言:指针(2)
  • Gin vs Beego vs Echo:三大主流 Go Web 框架深度对比
  • 前端开发中的常见问题与实战解决方案​
  • JS数组排序算法
  • scanpy单细胞转录组python教程(三):单样本数据分析之数据标准化、特征选择、细胞周期计算、回归等
  • 2025.8.10总结
  • 学生成绩管理系统的 SQL 表设计与多表查询实战
  • 部署一个免费开源的博客系统
  • 库的制作和原理
  • 双亲委派机制是什么?
  • 大模型工具集成四层架构:识别、协议、执行与实现
  • reinterpret_cast and static cast
  • Lua的数组、迭代器、table、模块
  • Elasticsearch 搜索模板(Search Templates)把“可配置查询”装进 Mustache
  • 从MySQL到大数据平台:基于Spark的离线分析实战指南