天天看點

Python程式設計:Flask擴充Flask-WTF和Flask-SQLAlchemy應用執行個體

檔案目錄結構

./
├── main.py
├── templates
│   └── index.html
└── static
    └── js
        └── jquery-3.3.1.min.js
      

一共涉及三個檔案

1、

jquery

-3.3.1.min.js 可百度下載下傳

2、 

main.py
# -*- coding: utf-8 -*-

from flask import Flask, render_template, request, url_for, redirect, jsonify
from flask_sqlalchemy import SQLAlchemy
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired

app = Flask(__name__)


# 配置資料庫資訊
class Config(object):
    SQLALCHEMY_DATABASE_URI = "mysql://root:[email protected]:3306/demo"

    SQLALCHEMY_TRACK_MODIFICATIONS = True

    SECRET_KEY = "adsfasdf9932@@fdsafsdaf"


app.config.from_object(Config)

db = SQLAlchemy(app)


class Author(db.Model):
    """作者"""
    __tablename__ = "tbl_author"

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(32))
    books = db.relationship("Book", backref="author")


class Book(db.Model):
    """書籍"""
    __tablename__ = "tbl_book"

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64))
    author_id = db.Column(db.Integer, db.ForeignKey("tbl_author.id"))


def db_init():
    """
    初始化資料庫
    mysql> create database demo default charset utf8;
    """
    db.drop_all()
    db.create_all()

    author1 = Author(name="吳承恩")
    author2 = Author(name="施耐庵")
    author3 = Author(name="羅貫中")
    author4 = Author(name="曹雪芹")
    db.session.add_all([author1, author2, author3, author4])
    db.session.commit()

    book1 = Book(name="西遊記", author=author1)
    book2 = Book(name="紅樓夢", author=author4)
    book3 = Book(name="三國演義", author=author3)
    book4 = Book(name="水浒傳", author=author2)
    db.session.add_all([book1, book2, book3, book4])
    db.session.commit()


class AuthorBookForm(FlaskForm):
    """作者書籍表單"""
    author_name = StringField(label="作者姓名", validators=[DataRequired("作者姓名不能為空")])
    book_name = StringField(label="書籍名稱", validators=[DataRequired("書籍名稱不能為空")])
    submit = SubmitField(label="送出")


# 視圖函數
@app.route("/", methods=["GET", "POST"])
def index():
    form = AuthorBookForm()

    # 驗證表單
    if form.validate_on_submit():
        author_name = form.author_name.data
        book_name = form.book_name.data

        # 儲存資料
        author = Author(name=author_name)
        db.session.add(author)
        db.session.commit()

        book = Book(name=book_name, author=author)
        db.session.add(book)
        db.session.commit()

    # 查詢資料
    authors = Author.query.all()
    return render_template("index.html", authors=authors, form=form)


@app.route("/deleteBook", methods=["POST"])
def delete_book():
    """删除書本資料
    接收json格式的資料 contentType: application/json
    """
    data = request.json
    book_id = data.get("bookId")

    book = Book.query.get(book_id)
    db.session.delete(book)
    db.session.commit()

    data = {
        "code": 0,
        "message": "delete success"
    }
    return jsonify(data)


@app.route("/deleteAuthor")
def delete_author():
    """删除作者書籍"""
    author_id = request.args.get("authorId")

    author = Author.query.get(author_id)
    db.session.delete(author)
    db.session.commit()

    return redirect(url_for("index"))


if __name__ == '__main__':
    # db_init()
    app.run(debug=True)
      

3、index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!-- 顯示表單 -->
<form action="/" method="post">
    {{ form.csrf_token }}

    {{ form.author_name.label }}
    {{ form.author_name }}
    {% for msg in form.author_name.errors %}
        {{ msg }}
    {% endfor %}

    {{ form.book_name.label }}
    {{ form.book_name }}
    {% for msg in form.book_name.errors %}
        {{ msg }}
    {% endfor %}

    {{ form.submit }}

</form>

<hr/>

<!-- 顯示作者書籍 -->
<ul>
    {% for author in authors %}
        <li>
            作者:{{ author.name }} <a href="/deleteAuthor?authorId={{ author.id }}">删除</a>
            <ul>
                {% for book in author.books %}
                    <li>書籍:{{ book.name }} <a href="javascript:" onclick="deleteBook({{ book.id }})">删除</a></li>
                {% endfor %}
            </ul>
        </li>
    {% endfor %}
</ul>

<script type="text/javascript" src="/static/js/jquery-3.3.1.min.js"></script>
<script>
    function deleteBook(bookId) {
        var data = {
            bookId: bookId
        };

        // 向後端發送json格式資料
        $.ajax({
            url: "/deleteBook", // 請求url
            type: "post", // 請求方式
            data: JSON.stringify(data), //向後端發送的請求體資料,将js對象轉為json字元串
            contentType: "application/json",//向後端發送的資料格式
            dataType: "json", // 後端傳回的資料格式
            success: function (result) {
                if (result.code === 0) {
                    location.href = "/";
                }
            }
        })
    }
</script>
</body>
</html>      

顯示效果

Python程式設計:Flask擴充Flask-WTF和Flask-SQLAlchemy應用執行個體