当前位置: 首页 > 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.lryc.cn/news/615820.html

相关文章:

  • 从Redisson源码角度深入理解Redis分布式锁的正确实现
  • Lua基础+Lua数据类型
  • Hadoop MapReduce过程
  • nginx+Lua环境集成、nginx+Lua应用
  • 分享一个基于Python和Hadoop的的电信客户特征可视化分析平台 基于Spark平台的电信客服数据存储与处理系统源码
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘mlflow’问题
  • leetcode2379:得到K个黑块的最少涂色次数(定长滑动窗口)
  • Boost.Asio io_service 与 线程 的分析
  • 字节:计算机存储单位
  • 算术运算符指南
  • 企业级WEB应用服务器TOMCAT — WEB技术详细部署
  • 使用Blender可视化多传感器坐标系转换
  • 从onnx模型到om模型的全自动化转化
  • 2025年APP开发趋势:4大方向重构行业格局
  • 【lucene】BlockDocsEnum 跟BlockImpactsDocsEnum 的区别
  • LeetCode 869.重新排序得到 2 的幂:哈希表+排序(一次初始化)
  • Java设计模式之开闭原则介绍与说明
  • 深入解析Go设计模式:命令模式实战
  • 分布微服务电商订单系统Rust编码开发[上]
  • Rust进阶-part6-宏
  • [激光原理与应用-224]:机械 - 机械设计与加工 - 常见的术语以及含义
  • 每日算法刷题Day60:8.10:leetcode 队列5道题,用时2h
  • 机器学习-增加样本、精确率与召回率
  • Modbus RTU转Profinet网关接在线循环Na离子实现PLC读取温度值
  • C# 中常用集合以及使用场景
  • 本地WSL部署接入 whisper + ollama qwen3:14b 总结字幕增加利用 Whisper 分段信息,全新 Prompt功能
  • Framework开发之Zygote进程2(基于开源的AOSP15)--init.rc在start zygote之后的事情(详细完整版逐行代码走读)
  • 《解锁 C++ 基础密码:输入输出、缺省参数,函数重载与引用的精髓》
  • 【Linux | 网络】数据链路层
  • 九、Linux Shell脚本:运算符与表达式