生活随笔
收集整理的這篇文章主要介紹了
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__
)
CSRFProtect
( app
)
app
. config
[ 'SQLALCHEMY_DATABASE_URI' ] = "mysql+pymysql://root:123456@127.0.0.1:3306/library2"
app
. config
[ 'SQLALCHEMY_TRACK_MODIFICATIONS' ] = False
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' ) )
@app
. route
( '/add_book' , methods
= [ 'POST' ] )
def add_book ( ) : """思路分析:1.獲取參數2.校驗參數3.通過作者名稱,查詢作者對象4.判斷作者,判斷書籍,進行添加5.重定向展示頁:return:""" author_name
= request
. form
. get
( "author" ) book_name
= request
. form
. get
( "book" ) if not all ( [ author_name
, book_name
] ) : return "作者或者書籍為空" author
= Author
. query
. filter ( Author
. name
== author_name
) . first
( ) 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
( ) return redirect
( url_for
( 'show_page' ) )
@app
. route
( '/delete_book/<int:book_id>' )
def delete_book ( book_id
) : book
= Book
. query
. get
( book_id
) db
. session
. delete
( book
) db
. session
. commit
( ) return redirect
( url_for
( 'show_page' ) )
@app
. route
( '/delete_author/<int:author_id>' )
def delete_author ( author_id
) : author
= Author
. query
. get
( author_id
) for book
in author
. books
: db
. session
. delete
( book
) db
. session
. delete
( author
) db
. session
. commit
( ) return redirect
( url_for
( 'show_page' ) ) if __name__
== '__main__' : app
. run
( debug
= True )
from flask
import Flask
, render_template
, flash
, request
from flask_sqlalchemy
import SQLAlchemy
from 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 ) name
= db
. Column
( db
. String
( 16 ) , unique
= True ) 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 ) name
= db
. Column
( db
. String
( 16 ) , unique
= True ) author_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. 驗證不通過就提示錯誤''' if author_form
. validate_on_submit
( ) : author_name
= author_form
. author
. databook_name
= author_form
. book
. dataauthor
= Author
. query
. filter_by
( name
= author_name
) . first
( ) 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 : 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 : 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" > { < 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:""" author_name
= request
. form
. get
( "author" ) book_name
= request
. form
. get
( "book" ) if not all ( [ author_name
, book_name
] ) : return "作者或者書籍為空" author
= Author
. query
. filter ( Author
. name
== author_name
) . first
( ) 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
( ) return redirect
( url_for
( 'show_page' ) )
七、刪除數據
@app
. route
( '/delete_book/<int:book_id>' )
def delete_book ( book_id
) : book
= Book
. query
. get
( book_id
) db
. session
. delete
( book
) db
. session
. commit
( ) return redirect
( url_for
( 'show_page' ) )
@app
. route
( '/delete_author/<int:author_id>' )
def delete_author ( author_id
) : author
= Author
. query
. get
( author_id
) for book
in author
. books
: db
. session
. delete
( book
) db
. session
. delete
( author
) db
. session
. commit
( ) return redirect
( url_for
( 'show_page' ) )
八、案例完整代碼
from flask
import Flask
, render_template
, flash
, request
, redirect
, url_for
from flask_sqlalchemy
import SQLAlchemy
from 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 ) name
= db
. Column
( db
. String
( 16 ) , unique
= True ) 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 ) name
= db
. Column
( db
. String
( 16 ) , unique
= True ) author_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
) : 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
( '刪除書籍出錯!!!' ) db
. session
. rollback
( ) else : flash
( '作者找不到~' ) return redirect
( url_for
( 'index' ) ) @app
. route
( '/delete_book/<book_id>' )
def delete_book ( book_id
) : book
= Book
. query
. get
( book_id
) if book
: try : db
. session
. delete
( book
) db
. session
. commit
( ) except Exception
as e
: print ( e
) flash
( '刪除書籍出錯!!!' ) db
. session
. rollback
( ) else : flash
( '書籍找不到~' ) 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. 驗證不通過就提示錯誤''' if author_form
. validate_on_submit
( ) : author_name
= author_form
. author
. databook_name
= author_form
. book
. dataauthor
= Author
. query
. filter_by
( name
= author_name
) . first
( ) 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 : 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 : 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 )
< !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請求來實現)
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_DATABASE_URI
= "mysql://root:root@127.0.0.1:3306/author_book_py04" SQLALCHEMY_TRACK_MODIFICATIONS
= True SECRET_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
. dataauthor
= 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
( ) author_li
= Author
. query
. all ( ) return render_template
( "author_book.html" , authors
= author_li
, form
= form
)
@app
. route
( "/delete_book" , methods
= [ "POST" ] )
def delete_book ( ) : req_dict
= request
. get_json
( ) book_id
= req_dict
. get
( "book_id" ) book
= Book
. query
. get
( book_id
) db
. session
. delete
( book
) db
. session
. commit
( ) 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" ) } ; var req_json = JSON . stringify ( data) $. ajax ( { url: "/delete_book" , type: "post" , data: req_json, contentType: "application/json" , dataType: "json" , success: function ( resp) { if ( resp. code == 0 ) { alert ( "ok" ) location. href = "/index" ; } } } ) } ) </ script>
</ body>
</ html>
重點解讀:
第二種 刪除書籍的實現方法(通過get請求來實現)
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_DATABASE_URI
= "mysql://root:root@127.0.0.1:3306/author_book_py04" SQLALCHEMY_TRACK_MODIFICATIONS
= True SECRET_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
. dataauthor
= 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
( ) author_li
= Author
. query
. all ( ) return render_template
( "author_book.html" , authors
= author_li
, form
= form
)
@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 = " /delete_book?book_id={{book.id}}" > GET刪除
</ a> {% endfor %}
</ ul> {% endfor %}
</ ul> < script src = " ../static/js/jquery-3.5.0.js" > </ script> < script> </ script>
</ body>
</ html>
重點解讀:
總結
以上是生活随笔 為你收集整理的Web框架——Flask系列之综合案例——图书管理系统(十) 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。