MST

星途 面试题库

面试题:Python的Flask框架下如何实现RESTful API设计

要求设计一个Flask应用的RESTful API,用于管理书籍信息。包括创建新书(POST请求)、获取所有书籍(GET请求)、根据ID获取单本书籍(GET请求)、更新书籍信息(PUT请求)和删除书籍(DELETE请求)。请说明设计思路,并提供主要的代码片段,同时解释如何处理请求数据和响应数据。
50.5万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 创建新书(POST请求):接收客户端发送的书籍信息(如书名、作者等),将其保存到数据库(这里假设使用SQLite作为示例数据库)。
  2. 获取所有书籍(GET请求):从数据库中查询所有书籍信息,并返回给客户端。
  3. 根据ID获取单本书籍(GET请求):根据客户端提供的书籍ID,从数据库中查询对应的书籍信息并返回。
  4. 更新书籍信息(PUT请求):接收客户端发送的更新后的书籍信息以及书籍ID,根据ID在数据库中找到对应的书籍并更新其信息。
  5. 删除书籍(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)

请求数据和响应数据处理

  1. 请求数据处理
    • POST和PUT请求:通过request.get_json()获取客户端发送的JSON格式数据,从中提取书籍的相关信息(如书名、作者),用于数据库操作。
    • GET和DELETE请求:通过URL参数获取书籍ID,用于查询或删除指定书籍。
  2. 响应数据处理
    • 使用jsonify函数将Python字典或列表转换为JSON格式的响应数据,返回给客户端。
    • 根据不同的操作结果返回不同的HTTP状态码,如创建成功返回201,未找到资源返回404等,以便客户端了解请求的处理情况。