flask后端分离

发布时间 2023-10-19 09:21:08作者: __username

一个简易demo

目录如下:

app.py

# app.py
from flask import Flask, request
from flask.views import MethodView
from extension import db,cors
from models import Book



app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///books.sqlite'  # 使用SQLite数据库,也可使用其他数据库
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False  #禁止追踪
db.init_app(app)
cors.init_app(app)

@app.route('/')
def hello_world():
    return 'hello world'


@app.cli.command()  # 自定义命令 create  / flask create
def create():
    db.drop_all()  # 旧的数据表删除
    db.create_all() # 创建新的数据表
    Book.init_db() # 初始化数据


class BookApi(MethodView):
    def get(self, book_id):
        if not book_id:
            books: [Book] = Book.query.all()
            results = [
                {
                    'id': book.id,
                    'book_name': book.book_name,
                    'book_type': book.book_type,
                    'book_prize': book.book_prize,
                    'book_number': book.book_number,
                    'book_publisher': book.book_publisher,
                    'author': book.author
                } for book in books
            ]
            return {
                'status': 'success',
                'message': '数据查询成功',
                'results': results
            }
        book: [Book] = Book.query.get(book_id)
        return {
            'status': 'success',
            'message': '数据查询成功',
            'results': {
                'id': book.id,
                'book_name': book.book_name,
                'book_type': book.book_type,
                'book_prize': book.book_prize,
                'book_number': book.book_number,
                'book_publisher': book.book_publisher,
                'author': book.author
            }
        }

    def post(self):
        form = request.json
        book = Book()
        book.book_number = form.get('book_number')
        book.book_name = form.get('book_name')
        book.book_type = form.get('book_type')
        book.book_prize = form.get('book_prize')
        book.author = form.get('author')
        book.book_publisher = form.get('book_publisher')
        db.session.add(book)
        db.session.commit()

        return {
            'status': 'success',
            'message': '数据添加成功'
        }

    def delete(self, book_id):
        book = Book.query.get(book_id)
        db.session.delete(book)
        db.session.commit()
        return {
            'status': 'success',
            'message': '数据删除成功'
        }

    def put(self, book_id):
        book: Book = Book.query.get(book_id)
        book.book_number = request.json.get('book_number')
        book.book_name = request.json.get('book_name')
        book.book_type = request.json.get('book_type')
        book.book_prize = request.json.get('book_prize')
        book.author = request.json.get('author')
        book.book_publisher = request.json.get('book_publisher')
        db.session.commit()
        return {
            'status': 'success',
            'message': '数据修改成功'
        }



book_view = BookApi.as_view('book_api')
app.add_url_rule('/books/',defaults={'book_id': None},
                 view_func=book_view, methods=['GET', ])
app.add_url_rule('/books/',view_func=book_view, methods=['POST', ])
app.add_url_rule("/books/<int:book_id>",
                 view_func=book_view, methods=['GET', 'PUT', 'DELETE'])



if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0')

extension.py

from flask_sqlalchemy import SQLAlchemy
from flask_cors import CORS # 跨域请求伪造

db = SQLAlchemy()
cors = CORS()

models.py

from extension import db


class Book(db.Model):
    __tablename = 'book'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    book_number = db.Column(db.String(255), nullable=False)
    book_name = db.Column(db.String(255), nullable=False)
    book_type = db.Column(db.String(255), nullable=False)
    book_prize = db.Column(db.Float, nullable=False)
    author = db.Column(db.String(255))
    book_publisher = db.Column(db.String(255))

    @staticmethod
    def init_db():
        rets = [
            (1, '001', '活着', '小说', 39.9, '余华', '某某出版社'),
            (2, '002', '三体', '科幻', 99.8, '刘慈欣', '重庆出版社')
        ]
        for ret in rets:
            book = Book()
            book.id = ret[0]
            book.book_number = ret[1]
            book.book_name = ret[2]
            book.book_type = ret[3]
            book.book_prize = ret[4]
            book.author = ret[5]
            book.book_publisher = ret[6]
            db.session.add(book)
        db.session.commit()