设计思路
- 创建新书(POST请求):接收客户端发送的书籍信息(如书名、作者等),将其保存到数据库(这里假设使用SQLite作为示例数据库)。
- 获取所有书籍(GET请求):从数据库中查询所有书籍信息,并返回给客户端。
- 根据ID获取单本书籍(GET请求):根据客户端提供的书籍ID,从数据库中查询对应的书籍信息并返回。
- 更新书籍信息(PUT请求):接收客户端发送的更新后的书籍信息以及书籍ID,根据ID在数据库中找到对应的书籍并更新其信息。
- 删除书籍(DELETE请求):根据客户端提供的书籍ID,从数据库中删除对应的书籍记录。
主要代码片段
from flask import Flask, jsonify, request
import sqlite3
app = Flask(__name__)
# 创建数据库表
def create_table():
conn = sqlite3.connect('books.db')
c = conn.cursor()
c.execute('''CREATE TABLE IF NOT EXISTS books
(id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
author TEXT NOT NULL)''')
conn.commit()
conn.close()
create_table()
# 创建新书(POST请求)
@app.route('/books', methods=['POST'])
def create_book():
data = request.get_json()
title = data.get('title')
author = data.get('author')
conn = sqlite3.connect('books.db')
c = conn.cursor()
c.execute("INSERT INTO books (title, author) VALUES (?,?)", (title, author))
conn.commit()
book_id = c.lastrowid
conn.close()
return jsonify({'id': book_id, 'title': title, 'author': author}), 201
# 获取所有书籍(GET请求)
@app.route('/books', methods=['GET'])
def get_all_books():
conn = sqlite3.connect('books.db')
c = conn.cursor()
c.execute("SELECT * FROM books")
books = c.fetchall()
conn.close()
result = []
for book in books:
book_dict = {'id': book[0], 'title': book[1], 'author': book[2]}
result.append(book_dict)
return jsonify(result)
# 根据ID获取单本书籍(GET请求)
@app.route('/books/<int:book_id>', methods=['GET'])
def get_book(book_id):
conn = sqlite3.connect('books.db')
c = conn.cursor()
c.execute("SELECT * FROM books WHERE id =?", (book_id,))
book = c.fetchone()
conn.close()
if book:
book_dict = {'id': book[0], 'title': book[1], 'author': book[2]}
return jsonify(book_dict)
return jsonify({'message': 'Book not found'}), 404
# 更新书籍信息(PUT请求)
@app.route('/books/<int:book_id>', methods=['PUT'])
def update_book(book_id):
data = request.get_json()
title = data.get('title')
author = data.get('author')
conn = sqlite3.connect('books.db')
c = conn.cursor()
c.execute("UPDATE books SET title =?, author =? WHERE id =?", (title, author, book_id))
conn.commit()
rows_updated = c.rowcount
conn.close()
if rows_updated > 0:
return jsonify({'id': book_id, 'title': title, 'author': author})
return jsonify({'message': 'Book not found'}), 404
# 删除书籍(DELETE请求)
@app.route('/books/<int:book_id>', methods=['DELETE'])
def delete_book(book_id):
conn = sqlite3.connect('books.db')
c = conn.cursor()
c.execute("DELETE FROM books WHERE id =?", (book_id,))
conn.commit()
rows_deleted = c.rowcount
conn.close()
if rows_deleted > 0:
return jsonify({'message': 'Book deleted successfully'})
return jsonify({'message': 'Book not found'}), 404
if __name__ == '__main__':
app.run(debug=True)
请求数据和响应数据处理
- 请求数据处理:
- POST和PUT请求:通过
request.get_json()
获取客户端发送的JSON格式数据,从中提取书籍的相关信息(如书名、作者),用于数据库操作。
- GET和DELETE请求:通过URL参数获取书籍ID,用于查询或删除指定书籍。
- 响应数据处理:
- 使用
jsonify
函数将Python字典或列表转换为JSON格式的响应数据,返回给客户端。
- 根据不同的操作结果返回不同的HTTP状态码,如创建成功返回201,未找到资源返回404等,以便客户端了解请求的处理情况。