1. 程式人生 > >flask學習:一個簡單案例綜合之前學到的知識

flask學習:一個簡單案例綜合之前學到的知識

黑馬的免費視訊課關於入門flask的我看完了,最後第五章實現了一個小案例,基本涵蓋了之前學到的所有知識。跟著敲了一遍,覺得還不錯,因此把程式碼在這裡分享一下。重要地方也都做了記錄。

前端截圖如下:

(竟然支援qq截圖直接複製,csdn真的是越來越優秀了,點贊!!!)

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

app = Flask(__name__)

'''
1.配置資料庫
2.新增書和作者的模型
3.新增資料
4,使用模板顯示資料庫查詢的資料
5.使用WTF顯示錶單
6.實現相關的增刪邏輯
'''

#配置資料庫的地址
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:
[email protected]
:3306/books' #跟蹤資料庫的修改,不建議開啟 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False app.secret_key='xck' db = SQLAlchemy(app) class Author(db.Model): __tablename__ = 'authors' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(16), unique=True) books = db.relationship('Book', backref='author') def __repr__(self): return "Author: {}".format(self.name) class Book(db.Model): __tablename__ = 'books' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(16), unique=True) author_id = db.Column(db.Integer, db.ForeignKey('authors.id')) def __repr__(self): return 'Books: {} {}'.format(self.name, self.author_id) class AuthorForm(FlaskForm): author = StringField(u'作者', validators=[DataRequired()]) book = StringField(u'書籍', validators=[DataRequired()]) submit = SubmitField(u'提交') db.drop_all() db.create_all() #生成資料 au1 = Author(name=u"老王") au2 = Author(name=u"老惠") au3 = Author(name=u"老劉") db.session.add_all([au1, au2, au3]) db.session.commit() bk1 = Book(name=u"老王回憶錄", author_id=au1.id) bk2 = Book(name=u"我讀書少,你別騙我", author_id=au1.id) bk3 = Book(name=u"如何才能讓自己更騷", author_id=au2.id) bk4 = Book(name=u"怎麼樣才能征服美麗少女", author_id=au3.id) bk5 = Book(name=u"如何征服英俊少男", author_id=au3.id) db.session.add_all([bk1, bk2, bk3, bk4, bk5]) db.session.commit() @app.route('/delete_author/<author_id>') def delete_author(author_id): author = Author.query.get(author_id) if author: try: Book.query.filter_by(author_id=author.id).delete() db.session.delete(author) db.session.commit() except Exception as e: print(e) flash(u"刪除作者失敗!") db.session.rollback() else: flash(u"作者找不到!") return redirect(url_for('index')) #刪除書籍-》網頁中刪除-》點選需要傳送書籍的ID給刪除書籍的路由-》路有需要接受引數 @app.route('/delete_book/<book_id>') def delete_book(book_id): #查詢資料庫,是否有該ID的書,如果有就刪除,沒有提示錯誤 book = Book.query.get(book_id) if book: try: db.session.delete(book) db.session.commit() except Exception as e: print(e) flash(u"刪除書籍失敗!") db.session.rollback() else: flash(u"書籍找不到!") #如何返回當前網址,---》重定向 #redirect:重定向,需要傳入網址或者路由地址 #url_for('index'):需要傳入檢視函式名,返回該檢視函式對應的路由地址 return redirect(url_for('index')) @app.route('/', methods=['POST', 'GET']) def index(): #建立自定義的表單類 author_form = AuthorForm() ''' 驗證邏輯: 1.呼叫wtf的函式實現驗證 2.驗證通過獲取資料 3.判斷作者是否存在 4.如果作者存在,判斷書籍是否存在,沒有重複書籍就新增資料,如果重複就提示錯誤 5.如果作者不存在,新增作者和書籍 6.驗證不通過就提示錯誤 ''' #1.呼叫wtf的函式實現驗證 if author_form.validate_on_submit(): #2.驗證通過獲取資料 author_name = author_form.author.data book_name = author_form.book.data #3.判斷作者是否存在 author = Author.query.filter_by(name=author_name).first() #4.如果作者存在 if author: #判斷書籍是否存在, book = Book.query.filter_by(name=book_name).first() #如果重複就提示錯誤 if book: flash("已存在同名書籍!") #沒有重複書籍就新增資料, else: try: new_book = Book(name=book_name, author_id=author.id) db.session.add(new_book) db.session.commit() except Exception as e: print(e) flash("新增書籍失敗!") db.session.rollback() else: #5.如果作者不存在,新增作者和書籍 try: new_author = Author(name=author_name) db.session.add(new_author) db.session.commit() new_book = Book(name=book_name, author_id=new_author.id) db.session.add(new_book) db.session.commit() except Exception as e: print(e) flash('新增作者和書籍失敗!') db.session.rollback() else: #6.驗證不通過就提示錯誤 if request.method == 'POST': flash("引數不全!") authors = Author.query.all() return render_template("books.html", authors=authors, form=author_form) if __name__ == '__main__': app.run(debug=True)

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form method="post">
    {{ form.csrf_token() }}
    {{ form.author.label }}{{ form.author }}<br>
    {{ form.book.label }}{{ form.book }}<br>
    {{ form.submit }}
    {# 顯示訊息顯示的內容 #}
    {% for message in get_flashed_messages() %}
        {{ message }}
    {% endfor %}

</form>

<hr>

{% for author in authors %}
    <li>{{ author }}<a href="{{ url_for("delete_author", author_id=author.id) }}">刪除</a></li>
    <ul>
    {% for book in author.books %}
    <li>{{ book.name }}<a href="{{ url_for("delete_book", book_id=book.id) }}">刪除</a> </li>
    {% else %}
        <li>無</li>
    {% endfor %}
    
    </ul>

{% endfor %}


</body>
</html>

PS:這個視訊課程只能算是入門,可以距我自己能寫專案的程度還要遠遠不夠,因此我準備繼續學習下一門有關flask的專案,學一個案例實戰,爭取拿下這個框架!