flask學習:一個簡單案例綜合之前學到的知識
阿新 • • 發佈:2018-11-26
黑馬的免費視訊課關於入門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的專案,學一個案例實戰,爭取拿下這個框架!