flask專案之圖書案例

重灌大師1024發表於2018-07-16

今天通過一個圖書小案例來演示一下flask專案的建立與應用,這個只是最簡單的專案建立,但是隻要掌握了這個思想,大型的專案也不在話下的。當然還是需要掌握其他很多的知識的!
廢話不多說,我們直接上程式碼(這是基於Python2.7的演示程式):

#coding:utf-8
from flask import Flask, render_template, flash, redirect, url_for
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):
    DEBUG=True
    #連線mysql資料的資訊
    SQLALCHEMY_DATABASE_URI="mysql://root:mysql@127.0.0.1:3306/author_book"
    #讓sqlalchemy跟蹤資料庫的修改
    SQLALCHEMY_TRACK_MODIFICATIONS=True
    SECRET_KEY="DSKFSDJKFHSKDKCNIASNCFIOFASNDCIOSANCIOSNIOCN"


app.config.from_object(Config)

#建立sqlalchemy資料庫的連線物件
db=SQLAlchemy(app)


class Author(db.Model):
    __tablename__="tbl_authors"
    id=db.Column(db.Integer,primary_key=True)
    name=db.Column(db.String(64),unique=True)
    books=db.relationship("Book",backref="author")

class Book(db.Model):
    __tablename__="tbl_books"
    id=db.Column(db.Integer,primary_key=True)
    name=db.Column(db.String(64),unique=True)
    author_id=db.Column(db.Integer,db.ForeignKey('tbl_authors.id'))

class AuthorBookForm(FlaskForm):
    author_name=StringField(label=u"作者",validators=[DataRequired()])
    book_name=StringField(label=u"書籍",validators=[DataRequired()])
    submit=SubmitField(label=u"提交")

@app.route('/',methods=["GET","POST"])
def index():
    form=AuthorBookForm()
    error_msg = ""
    if form.validate_on_submit():
        author_name=form.author_name.data
        book_name=form.book_name.data


        author_count=Author.query.filter_by(name=author_name).count()

        if author_count==0:
            author=Author(name=author_name)
            db.session.add(author)
            db.session.commit()
            book_count=Book.query.filter_by(name=book_name).count()
            if book_count==0:
                book=Book(name=book_name,author_id=author.id)
                db.session.add(book)
                db.session.commit()
            else:
                error_msg=(u"該圖書已經存在")
                db.session.delete(Author.query.filter_by(name=author_name)[0])
        else:
            book_count = Book.query.filter_by(name=book_name).count()
            author=Author.query.filter_by(name=author_name)[0]
            if book_count==0:
                book = Book(name=book_name, author_id=author.id)
                db.session.add(book)
                db.session.commit()
            else:
                error_msg = (u"該圖書已經存在")

    # 查詢資料庫
    authors = Author.query.order_by(Author.id.desc()).all()

    return render_template("author_book.html",authors=authors,form=form,error_msg=error_msg)


@app.route("/delete_book/<int:id>")
def delete_book(id):
    book=Book.query.get(id)
    db.session.delete(book)
    db.session.commit()

    return redirect(url_for("index"))

if __name__ == '__main__':
    #刪除資料庫中所有的表
    db.drop_all()
    #建立所有的表
    db.create_all()

    au_xi=Author(name="郭敬明")
    au_qian=Author(name="韓寒")
    au_san=Author(name="唐家三少")

    db.session.add_all([au_xi,au_qian,au_san])
    db.session.commit()

    bk_xi=Book(name='吞噬星空',author_id=au_xi.id)
    bk_xi2=Book(name="寸芒",author_id=au_qian.id)
    bk_qian=Book(name="縹緲之旅",author_id=au_qian.id)
    bk_san=Book(name="冰火魔廚",author_id=au_san.id)

    db.session.add_all([bk_qian,bk_san,bk_xi,bk_xi2])
    db.session.commit()
    app.run()

下圖為專案展示介面:
這裡寫圖片描述

1.首先,我們匯入了 Flask 類。這個類的例項將會是我們的 WSGI 應用程式。
2.接下來,我們建立一個該類的例項,第一個引數是應用模組或者包的名稱。 如果你使用單一的模組(如本例),你應該使用 name ,因為模組的名稱將會因其作為單獨應用啟動還是作為模組匯入而有不同( 也即是 ‘main’ 或實際的匯入名)。這是必須的,這樣 Flask 才知道到哪去找模板、靜態檔案等等。詳情見 Flask 的文件。
3.然後,我們使用 route() 裝飾器告訴 Flask 什麼樣的URL 能觸發我們的函式。
這個函式的名字也在生成 URL 時被特定的函式採用,這個函式返回我們想要顯示在使用者瀏覽器中的資訊。
4.最後我們用 run() 函式來讓應用執行在本地伺服器上。 其中 if name == ‘main‘: 確保伺服器只會在該指令碼被 Python 直譯器直接執行的時候才會執行,而不是作為模組匯入的時候。

該專案可以實現向資料庫中新增作者和圖書,並且立即顯示到當前介面,也可以選擇性的刪除圖書,任何更改都會在展示介面立即更新。
以上就是這個小專案,不做過多解釋,讀者可以將程式碼拿走自己除錯。

相關文章