日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

Web框架——Flask系列之综合案例——图书管理系统(十)

發布時間:2024/7/5 windows 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Web框架——Flask系列之综合案例——图书管理系统(十) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、知識點:

  • 表單創建
  • 數據庫操作
  • 一對多關系演練
  • 二、實現步驟:

  • 創建數據庫配置信息,定義模型類
  • 創建數據庫表,添加測試數據
  • 編寫html頁面,展示數據
  • 添加數據
  • 刪除書籍,刪除作者
  • 三、創建數據庫連接信息,定義模型

    from flask import Flask, render_template, redirect, url_for, flash, request from flask_sqlalchemy import SQLAlchemy from flask_wtf.csrf import CSRFProtectapp = Flask(__name__)#開啟csrf保護 CSRFProtect(app)#設置數據庫配置信息 app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://root:123456@127.0.0.1:3306/library2" app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False #壓制警告信息#創建SQLAlchemy對象,關聯app db = SQLAlchemy(app)#設置密碼 app.config['SECRET_KEY'] = "jfkdjfkdkjf"#編寫模型類 #作者(一方) class Author(db.Model):__tablename__ = '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__ = '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('authors.id')) #或者是, Author.id#添加書籍 @app.route('/add_book', methods=['POST']) def add_book():"""思路分析:1.獲取參數2.校驗參數3.通過作者名稱,查詢作者對象4.判斷作者,判斷書籍,進行添加5.重定向展示頁:return:"""# 1.獲取參數author_name = request.form.get("author")book_name = request.form.get("book")# 2.校驗參數if not all([author_name,book_name]):return "作者或者書籍為空"# 3.通過作者名稱,查詢作者對象author = Author.query.filter(Author.name == author_name).first() # 有金庸# 4.判斷作者,判斷書籍,進行添加# 判斷作者是否存在if author:# 通過書籍名稱,查詢書籍對象 數據庫,古龍寫了 天龍八部book = Book.query.filter(Book.name == book_name, Book.author_id == author.id).first()# 判斷書籍是否存在if book:flash('該作者有該書籍')else:# 創建書籍對象,添加到數據庫book = Book(name=book_name, author_id=author.id)db.session.add(book)db.session.commit()else:# 創建作者添加到數據庫author = Author(name=author_name)db.session.add(author)db.session.commit()# 創建書籍添加到數據庫book = Book(name=book_name, author_id=author.id)db.session.add(book)db.session.commit()# 5.重定向展示頁return redirect(url_for('show_page'))#刪除書籍 @app.route('/delete_book/<int:book_id>') def delete_book(book_id):#1.根據編號獲取書籍對象book = Book.query.get(book_id)#2.刪除書籍db.session.delete(book)db.session.commit()#3.重定向頁面展示return redirect(url_for('show_page'))#刪除作者 @app.route('/delete_author/<int:author_id>') def delete_author(author_id):#1.通過編號獲取作者對象author = Author.query.get(author_id)#2.刪除作者書籍for book in author.books:db.session.delete(book)#3.刪除作者對象db.session.delete(author)db.session.commit()#4.重定向展示頁面return redirect(url_for('show_page'))if __name__ == '__main__':app.run(debug=True)
    • myCode
    from flask import Flask,render_template,flash,request from flask_sqlalchemy import SQLAlchemyfrom flask_wtf import FlaskForm from wtforms import StringField,SubmitField from wtforms.validators import DataRequiredapp = Flask(__name__)# 數據庫配置:數據庫地址、關閉自動跟蹤修改 app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:root@127.0.0.1/flask_books' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False app.secret_key = 'Zep03'# 創建數據庫對象 db = SQLAlchemy(app)''' 1. 配置數據庫a.導入SQLAlchemy擴展b.創建db對象,并配置參數c.通過mysql終端創建數據庫 2. 添加書和作者的模型a.模型要繼承db.Modelb.__tablaname__:定義表名c.db.Column:定義字段名d.db.relationship: 關系引用 3. 添加數據 4. 使用模板顯示數據庫查詢的數據a.查詢所有的作者信息,將信息傳遞給模板b.模板中按照格式,一次for循環作者和書籍即可(作者獲取書籍,用的是關系引用) 5. 使用WTF顯示表單a.自定義表單類b.模板中顯示c.設置secret_key/解決編碼問題/csrf_token 6. 實現相關的增刪邏輯a.增加數據'''# 定義書和作者模型# 作者模型 class Author(db.Model):# 表名__tablename__ = 'authors'# 字段名id = db.Column(db.Integer,primary_key=True) #作者idname = db.Column(db.String(16),unique=True) #作者名name# 關系引用# books是給Author自己用的,author是給Book模型用的books = db.relationship('Book',backref='author')def __refr__(self):return 'Author: %s ' % self.name# 書籍模型 class Book(db.Model):# 表名__tablename__ = 'books'# 字段名id = db.Column(db.Integer, primary_key=True) # 書籍的idname = db.Column(db.String(16), unique=True) # 書籍名nameauthor_id = db.Column(db.Integer,db.ForeignKey('authors.id'))def __refr__(self):return 'Book: %s %s ' % self.name,self.author_id# 自定義表單類 class AuthorForm(FlaskForm):author = StringField('作者',validators=[DataRequired()])book = StringField('書籍',validators=[DataRequired()])submit = SubmitField('提交')@app.route('/',methods=['GET','POST']) 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.databook_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() # 添加失敗要進行回滾操作!# 5. 如果作者不存在,添加作者和書籍else: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__':db.drop_all()db.create_all()# 生成數據au1 = Author(name='老王')au2 = Author(name='老尹')au3 = Author(name='老劉')# 把數據提交給用戶會話db.session.add_all([au1, au2, au3])# 提交會話db.session.commit()bk1 = Book(name='老王回憶錄', author_id=au1.id)bk2 = Book(name='我讀書少,你別騙我', author_id=au1.id)bk3 = Book(name='如何才能讓自己更騷', author_id=au2.id)bk4 = Book(name='怎樣征服美麗少女', author_id=au3.id)bk5 = Book(name='如何征服英俊少男', author_id=au3.id)# 把數據提交給用戶會話db.session.add_all([bk1, bk2, bk3, bk4, bk5])# 提交會話db.session.commit()app.run(debug=True)

    四、創建表,添加測試數據

    if __name__ == '__main__':#為了演示方便,先刪除所有表,再創建db.drop_all()db.create_all()#添加測試數據庫# 生成數據au1 = Author(name='老王')au2 = Author(name='老尹')au3 = Author(name='老劉')# 把數據提交給用戶會話db.session.add_all([au1, au2, au3])# 提交會話db.session.commit()bk1 = Book(name='老王回憶錄', author_id=au1.id)bk2 = Book(name='我讀書少,你別騙我', author_id=au1.id)bk3 = Book(name='如何才能讓自己更騷', author_id=au2.id)bk4 = Book(name='怎樣征服美麗少女', author_id=au3.id)bk5 = Book(name='如何征服英俊少男', author_id=au3.id)# 把數據提交給用戶會話db.session.add_all([bk1, bk2, bk3, bk4, bk5])# 提交會話db.session.commit()app.run(debug=True)

    五、數據顯示&表單添加

    • 后端代碼:
    #展示頁面 @app.route('/') def show_page():#查詢數據庫authors = Author.query.all()# 渲染到頁面return render_template('library.html',authors=authors)
    • 前端代碼
    • 創建文件 library.html ,編寫以下代碼:
    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body>{#注冊表單#}<form action="/add_book" method="post">{# 設置隱藏的csrf_token #}<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"><p><label>作者</label><input type="text" name="author"><br></p><p><label>書籍</label><input type="text" name="book"><br></p><p><input type="submit" value="添加"></p>{% for message in get_flashed_messages() %}<span style="color: red">{{ message }}</span>{% endfor %}</form><hr>{# 書籍展示 #}<h2>書籍展示</h2><ul>{% for author in authors %}<li>作者: {{ author.name }} <a href="{{ url_for('delete_author',author_id=author.id) }}">刪除</a></li><br><ul>{% for book in author.books %}<li>書籍: {{ book.name }} <a href="{{ url_for('delete_book',book_id=book.id) }}">刪除</a></li><br>{% endfor %}</ul>{% endfor %}</ul> </body> </html>

    六、添加數據

    • 添加書籍
    @app.route('/add_book', methods=['POST']) def add_book():"""思路分析:1.獲取參數2.校驗參數3.通過作者名稱,查詢作者對象4.判斷作者,判斷書籍,進行添加5.重定向展示頁:return:"""# 1.獲取參數author_name = request.form.get("author")book_name = request.form.get("book")# 2.校驗參數if not all([author_name,book_name]):return "作者或者書籍為空"# 3.通過作者名稱,查詢作者對象author = Author.query.filter(Author.name == author_name).first() # 有金庸# 4.判斷作者,判斷書籍,進行添加# 判斷作者是否存在if author:# 通過書籍名稱,查詢書籍對象 數據庫,古龍寫了 天龍八部book = Book.query.filter(Book.name == book_name, Book.author_id == author.id).first()# 判斷書籍是否存在if book:flash('該作者有該書籍')else:# 創建書籍對象,添加到數據庫book = Book(name=book_name, author_id=author.id)db.session.add(book)db.session.commit()else:# 創建作者添加到數據庫author = Author(name=author_name)db.session.add(author)db.session.commit()# 創建書籍添加到數據庫book = Book(name=book_name, author_id=author.id)db.session.add(book)db.session.commit()# 5.重定向展示頁return redirect(url_for('show_page'))

    七、刪除數據

    • 刪除書籍
    #刪除書籍 @app.route('/delete_book/<int:book_id>') def delete_book(book_id):#1.根據編號獲取書籍對象book = Book.query.get(book_id)#2.刪除書籍db.session.delete(book)db.session.commit()#3.重定向頁面展示return redirect(url_for('show_page'))
    • 刪除作者
    #刪除作者 @app.route('/delete_author/<int:author_id>') def delete_author(author_id):#1.通過編號獲取作者對象author = Author.query.get(author_id)#2.刪除作者書籍for book in author.books:db.session.delete(book)#3.刪除作者對象db.session.delete(author)db.session.commit()#4.重定向展示頁面return redirect(url_for('show_page'))

    八、案例完整代碼


    • Flask_books_project.py文件
    from flask import Flask,render_template,flash,request,redirect,url_for from flask_sqlalchemy import SQLAlchemyfrom flask_wtf import FlaskForm from wtforms import StringField,SubmitField from wtforms.validators import DataRequiredapp = Flask(__name__)# 數據庫配置:數據庫地址、關閉自動跟蹤修改 app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:root@127.0.0.1/flask_books' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False app.secret_key = 'Zep03'# 創建數據庫對象 db = SQLAlchemy(app)''' 1. 配置數據庫a.導入SQLAlchemy擴展b.創建db對象,并配置參數c.通過mysql終端創建數據庫 2. 添加書和作者的模型a.模型要繼承db.Modelb.__tablaname__:定義表名c.db.Column:定義字段名d.db.relationship: 關系引用 3. 添加數據 4. 使用模板顯示數據庫查詢的數據a.查詢所有的作者信息,將信息傳遞給模板b.模板中按照格式,一次for循環作者和書籍即可(作者獲取書籍,用的是關系引用) 5. 使用WTF顯示表單a.自定義表單類b.模板中顯示c.設置secret_key/解決編碼問題/csrf_token 6. 實現相關的增刪邏輯a.增加數據b.刪除書籍——》網頁中刪除——》點擊需要發送書籍的ID給刪除書籍的路由——》路由需要接收參數url_for的使用 / for else的使用 / redirect的使用c.刪除作者'''# 定義書和作者模型# 作者模型 class Author(db.Model):# 表名__tablename__ = 'authors'# 字段名id = db.Column(db.Integer,primary_key=True) #作者idname = db.Column(db.String(16),unique=True) #作者名name# 關系引用# books是給Author自己用的,author是給Book模型用的books = db.relationship('Book',backref='author')def __refr__(self):return 'Author: %s ' % self.name# 書籍模型 class Book(db.Model):# 表名__tablename__ = 'books'# 字段名id = db.Column(db.Integer, primary_key=True) # 書籍的idname = db.Column(db.String(16), unique=True) # 書籍名nameauthor_id = db.Column(db.Integer,db.ForeignKey('authors.id'))def __refr__(self):return 'Book: %s %s ' % self.name,self.author_id# 自定義表單類 class AuthorForm(FlaskForm):author = StringField('作者',validators=[DataRequired()])book = StringField('書籍',validators=[DataRequired()])submit = SubmitField('提交')@app.route('/delete_author/<author_id>') def delete_author(author_id):# 查詢數據庫,是否有該ID的作者,如果有就刪除(先刪書,再刪作者),沒有就提示錯誤# 1.查詢數據庫,author = Author.query.get(author_id)# 2.如果有就刪除(先刪書,再刪作者)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('刪除書籍出錯!!!')db.session.rollback()# 3.沒有就提示錯誤else:flash('作者找不到~')return redirect(url_for('index'))@app.route('/delete_book/<book_id>') def delete_book(book_id):# 1. 查詢數據庫,是否有該ID的書,book = Book.query.get(book_id)# 2.如果有就刪除,if book:try:db.session.delete(book)db.session.commit()except Exception as e:print(e)flash('刪除書籍出錯!!!')db.session.rollback()# 3.沒有就提示錯誤else:flash('書籍找不到~')# 如何返回當前網址——》重定向# return redirect('www.baidu.com')# redirect():重定向,需要傳入網址/路由地址# url_for():需要傳入視圖函數名,返回該視圖函數對應的路由地址print(url_for('index'))return redirect(url_for('index'))@app.route('/',methods=['GET','POST']) 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.databook_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() # 添加失敗要進行回滾操作!# 5. 如果作者不存在,添加作者和書籍else: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__':db.drop_all()db.create_all()# 生成數據au1 = Author(name='老王')au2 = Author(name='老尹')au3 = Author(name='老劉')# 把數據提交給用戶會話db.session.add_all([au1, au2, au3])# 提交會話db.session.commit()bk1 = Book(name='老王回憶錄', author_id=au1.id)bk2 = Book(name='我讀書少,你別騙我', author_id=au1.id)bk3 = Book(name='如何才能讓自己更騷', author_id=au2.id)bk4 = Book(name='怎樣征服美麗少女', author_id=au3.id)bk5 = Book(name='如何征服英俊少男', author_id=au3.id)# 把數據提交給用戶會話db.session.add_all([bk1, bk2, bk3, bk4, bk5])# 提交會話db.session.commit()app.run(debug=True)
    • books.html文件
    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>圖書管理</title> </head> <body><form method="post">{{ form.csrf_token() }}{{ form.author.label }} {{ form.author }} <br>{{ form.book.label }} {{ form.book }} <br>{{ form.submit }} <br></form><!-- 顯示消息閃現的內容-->{% for message in get_flashed_messages() %}{{message}}{% endfor %}<hr><!-- 先遍歷作者,然后在作者里遍歷書籍--><ul>{% for author in authors %}<li>{{author.name}} <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 %}</ul></body> </html>

    第一種 刪除書籍的實現方法(通過post請求來實現)

    • myCode
    from flask import Flask,render_template,request,redirect,url_for,jsonify from flask_sqlalchemy import SQLAlchemy from flask_wtf import FlaskForm from wtforms import StringField,SubmitField from wtforms.validators import DataRequired import json app = Flask(__name__)class Config(object):'''配置參數'''# 數據庫sqlAlchemy的配置參數,數據庫鏈接地址SQLALCHEMY_DATABASE_URI = "mysql://root:root@127.0.0.1:3306/author_book_py04"# 動態追蹤修改設置,如未設置只會提示警告SQLALCHEMY_TRACK_MODIFICATIONS = TrueSECRET_KEY = "JDIOGDKFNKXNCV12345D4FSDFS"app.config.from_object(Config)db = SQLAlchemy(app)# 定義數據庫的模型 class Author(db.Model):'''作者表'''__tablename__ = "tbl_authors"id = db.Column(db.Integer,primary_key=True)name = db.Column(db.String(32),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="作者:",validators=[DataRequired("作者必填!")])book_name = StringField(label="書名:",validators=[DataRequired("書名必填!")])submit = SubmitField(label="保存")@app.route("/index",methods=["GET","POST"]) def index():# 創建表單對象form = AuthorBookForm()# 驗證表單成功if form.validate_on_submit():author_name = form.author_name.databook_name = form.book_name.data# 保存到數據庫author = Author(name=author_name)db.session.add(author)db.session.commit()book = Book(name=book_name,author_id=author.id)# book = Book(name=book_name,author=author)db.session.add(book)db.session.commit()# 查詢數據庫author_li = Author.query.all()return render_template("author_book.html",authors = author_li,form=form)# 約定前端傳過來的數據格式: # post /delete_book json # {"book_id":xxx}# 刪除書籍 @app.route("/delete_book",methods=["POST"]) def delete_book():# 提取參數# 如果前端發送的請求體數據是json格式,# get_json會解析成字典格式# 前提:要求前端傳送的數據的# Content-Type:application/jsonreq_dict = request.get_json()# 將json格式字符串轉換為python中的字典# json.loads(req_data)book_id = req_dict.get("book_id")# 刪除數據book = Book.query.get(book_id)db.session.delete(book)db.session.commit()# "Content-Typel":"application/json"return jsonify(code=0,message="OK")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_xi,bk_xi2,bk_qian,bk_san])db.session.commit()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_name.label}}<p>{{form.author_name}}</p>{% for msg in form.author_name.errors %}<p>{{msg}}</p>{% endfor %}{{form.book_name.label}}<p>{{form.book_name}}</p>{% for msg in form.book_name.errors %}<p>{{msg}}</p>{% endfor %}{{form.submit}}</form><hr><ul>{% for author in authors %}<li>作者:{{author.name}}</li><ul>{% for book in author.books %}<li>書籍:{{book.name}}</li><a href="javascript:;" book-id="{{book.id}}">刪除</a>{% endfor %}</ul>{% endfor %}</ul><script src="../static/js/jquery-3.5.0.js"></script><script>$("a").click(function () {var data = {book_id:$(this).attr("book-id")};// # 將上面data字典格式的數據轉換為json字符串格式var req_json = JSON.stringify(data)// $.post("/delete_book",req_json,function (resp) {// if (resp.code ==0) {// location.href = "/index";// }// },"json")$.ajax({url:"/delete_book", //請求的后端urltype:"post", //請求方式data:req_json, // 向后端發送的請求體數據contentType:"application/json", //指明向后端發送的數據格式dataType:"json", // 指明后端返回的數據格式為jsonsuccess:function (resp) {if (resp.code == 0) {alert("ok")location.href = "/index";}}})})</script> </body> </html>


    重點解讀:

    第二種 刪除書籍的實現方法(通過get請求來實現)

    • myCode
    from flask import Flask,render_template,request,redirect,url_for,jsonify from flask_sqlalchemy import SQLAlchemy from flask_wtf import FlaskForm from wtforms import StringField,SubmitField from wtforms.validators import DataRequired import json app = Flask(__name__)class Config(object):'''配置參數'''# 數據庫sqlAlchemy的配置參數,數據庫鏈接地址SQLALCHEMY_DATABASE_URI = "mysql://root:root@127.0.0.1:3306/author_book_py04"# 動態追蹤修改設置,如未設置只會提示警告SQLALCHEMY_TRACK_MODIFICATIONS = TrueSECRET_KEY = "JDIOGDKFNKXNCV12345D4FSDFS"app.config.from_object(Config)db = SQLAlchemy(app)# 定義數據庫的模型 class Author(db.Model):'''作者表'''__tablename__ = "tbl_authors"id = db.Column(db.Integer,primary_key=True)name = db.Column(db.String(32),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="作者:",validators=[DataRequired("作者必填!")])book_name = StringField(label="書名:",validators=[DataRequired("書名必填!")])submit = SubmitField(label="保存")@app.route("/index",methods=["GET","POST"]) def index():# 創建表單對象form = AuthorBookForm()# 驗證表單成功if form.validate_on_submit():author_name = form.author_name.databook_name = form.book_name.data# 保存到數據庫author = Author(name=author_name)db.session.add(author)db.session.commit()book = Book(name=book_name,author_id=author.id)# book = Book(name=book_name,author=author)db.session.add(book)db.session.commit()# 查詢數據庫author_li = Author.query.all()return render_template("author_book.html",authors = author_li,form=form)# 約定前端傳過來的數據格式: # post /delete_book json # {"book_id":xxx}# # 刪除書籍 # @app.route("/delete_book",methods=["POST"]) # def delete_book(): # # 提取參數 # # 如果前端發送的請求體數據是json格式, # # get_json會解析成字典格式 # # 前提:要求前端傳送的數據的 # # Content-Type:application/json # req_dict = request.get_json() # # 將json格式字符串轉換為python中的字典 # # json.loads(req_data) # # book_id = req_dict.get("book_id") # # # 刪除數據 # book = Book.query.get(book_id) # db.session.delete(book) # db.session.commit() # # # "Content-Typel":"application/json" # return jsonify(code=0,message="OK") ## 刪除書籍 @app.route("/delete_book",methods=["GET"]) def delete_book():book_id = request.args.get("book_id")# 刪除數據book = Book.query.get(book_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_xi,bk_xi2,bk_qian,bk_san])db.session.commit()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_name.label}}<p>{{form.author_name}}</p>{% for msg in form.author_name.errors %}<p>{{msg}}</p>{% endfor %}{{form.book_name.label}}<p>{{form.book_name}}</p>{% for msg in form.book_name.errors %}<p>{{msg}}</p>{% endfor %}{{form.submit}}</form><hr><ul>{% for author in authors %}<li>作者:{{author.name}}</li><ul>{% for book in author.books %}<li>書籍:{{book.name}}</li> <!-- <a href="javascript:;" book-id="{{book.id}}">刪除</a>--><a href="/delete_book?book_id={{book.id}}" >GET刪除</a>{% endfor %}</ul>{% endfor %}</ul><script src="../static/js/jquery-3.5.0.js"></script><script>// $("a").click(function () {// var data = {// book_id:$(this).attr("book-id")// };// // # 將上面data字典格式的數據轉換為json字符串格式// var req_json = JSON.stringify(data)//// // $.post("/delete_book",req_json,function (resp) {// // if (resp.code ==0) {// // location.href = "/index";// // }// // },"json")// $.ajax({// url:"/delete_book", //請求的后端url// type:"post", //請求方式// data:req_json, // 向后端發送的請求體數據// contentType:"application/json", //指明向后端發送的數據格式// dataType:"json", // 指明后端返回的數據格式為json// success:function (resp) {// if (resp.code == 0) {// alert("ok")// location.href = "/index";// }// }// })// })</script> </body> </html>

    重點解讀:

    總結

    以上是生活随笔為你收集整理的Web框架——Flask系列之综合案例——图书管理系统(十)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 日日爽夜夜 | 夜色一区二区 | 痴汉电车在线观看 | 免费不卡视频 | 人人妻人人爽人人澡人人精品 | 欧美壮男野外gaytube | 狠狠v欧美v日韩v亚洲ⅴ | 免费看黄视频的网站 | 一二三区在线视频 | 亚洲精品天堂成人片av在线播放 | 国产亚洲视频一区 | 亚洲精品理论 | 成年人免费在线观看网站 | 97免费看 | 97自拍偷拍视频 | 亚洲人成色777777老人头 | 免费污片网站 | 欧美熟妇一区二区 | 午夜黄色在线观看 | 日韩乱码人妻无码系列中文字幕 | 亚洲最大成人在线 | 欧美一级黄视频 | 国产裸体舞一区二区三区 | 中文字幕永久免费 | 欧美六区 | 亚洲高清天堂 | 国产一级片网站 | 国产精品久久久久久久免费 | 亚洲av色一区二区三区精品 | 久久婷婷影视 | 久草免费在线观看 | 亚洲福利av | 少妇捆绑紧缚av | 影音先锋 日韩 | 亚洲最大福利网 | 精品国产乱码久久久久久1区2区 | 日本在线一区二区三区 | 欧美交换国产一区内射 | 日韩一级高清 | 免费视频91| 国产传媒在线播放 | 欧美成人三级精品 | 91大神在线看 | 国产在线播放一区二区 | 日韩五十路 | 久久无码专区国产精品s | 免费高清视频一区二区三区 | 欧美成年人| 中文久草| 猎艳山村丰满少妇 | 高跟鞋肉丝交足91 | 国产精品99久久久久久久女警 | 美妇湿透娇羞紧窄迎合 | 久久精品aaaaaa毛片 | 久久精品国产亚洲AV无码麻豆 | 亚洲黄网站在线观看 | 久久精品国产亚洲av麻豆 | 91视频导航 | 91免费版在线 | 无码精品一区二区免费 | 欧洲-级毛片内射 | 亚洲久热| 国产亚洲精品久久 | 久久精品黄aa片一区二区三区 | 亚洲97 | 让男按摩师摸好爽视频 | 日韩精彩视频在线观看 | 中文字幕日韩三级片 | 亚洲综合精品在线 | 精品无码m3u8在线观看 | 亚洲草逼 | 国产懂色av | 久久成人久久爱 | a级片国产 | 高潮毛片又色又爽免费 | 中文字幕人乱码中文字 | 国产真实交换夫妇视频 | 狠狠鲁狠狠干 | 久久久久在线 | 中文字幕精品三级久久久 | 日韩中文字幕高清 | 色综合av综合无码综合网站 | 久久久香蕉视频 | 麻豆回家视频区一区二 | 亚洲国产视频一区二区三区 | 久久久久久久久久久av | 成人免费久久 | 久久久久成人精品免费播放动漫 | 一区二区精品久久 | 精品乱子伦一区二区三区 | 日韩激情小说 | 男女视频网站 | 天天操天天干天天干 | 国内偷拍精品视频 | 伊人欧美在线 | 午夜整容室 | 伊人色影院 | 看91 | 伊人中文字幕在线观看 |