Flask Python Web框架(三)
阿新 • • 發佈:2018-11-25
一、Flask框架中檔案的上傳(重點)
1、注意問題: 表單中如果有檔案上傳的話,必須遵循以下兩個要求: (1)提交方式method 必須為post (2)表單的 enctype 屬性的值必須為 multipart/from-data 2、伺服器端 (1)通過 request.files 獲取上傳的檔案 f = request.files['檔案框的name值'] (2)通過 f.save(儲存路徑) 將檔案儲存至指定目錄處 通過 f.filename 獲取檔案的名稱 f.save('static/ + f.filename') 3、譬如:以下是長用的檔案上傳方式,檢視處理函式程式碼展示: @app.route('/05-file',methods=['GET','POST']) def file_views(): if request.method == 'GET': return render_template('05-file.html') else: #獲取上傳的檔案 f = request.files['uing'] #將上傳的檔案儲存至指定的目錄處 #filename = f.filename #將檔名稱改為當前時間作為名稱,在上傳 ftime = datetime.datetime.now().strftime('%Y%m%d%H%M%S%f') #獲取檔案的副檔名 ext = f.filename.split('.')[1] filename = ftime + '.' + ext print('檔名稱:'+filename) #將上傳的檔案儲存至指定目錄處[絕對路徑] basedir = os.path.dirname(__file__) upload_path = os.path.join(basedir,'static/upload',filename) f.save(upload_path) return 'Upload OK'
二、模型 - Models
1、什麼是模型? 模型,是根據資料庫中表的結構而創建出來的class。 每一張表對應到程式語言中,就是一個class 表中的每一個列對應到程式語言中就是class中的一個屬性 2、模型的框架 - ORM ORM:Object Relation Mapping 中文名稱:物件關係對映 ORM的三大特徵: 1、資料表(table)到程式設計類(class)的對映 資料庫中的每一張表對應到程式語言中都有一個類 在ORM中: 允許將資料表自動生成一個類 允許將類自動生成一張資料表 2、資料型別的對映 將資料庫表中的欄位以及資料型別對應到程式語言中類的屬性 在ORM中: 允許將表中的欄位和資料型別自動對映到程式語言中,也允許將類中的屬性 和資料型別也自動對映到表中 3、關係對映 在資料庫中表與表之間的關係 對應 到程式語言中類與類之間的關係 資料庫中表與表之間的關係: 1、一對一 外來鍵,主鍵,唯一索引 A表中的一條資料只能與B表中的一條資料相關聯 2、一對多 外來鍵,主鍵 A表中的一條資料可以與B表中的任意多條資料相關聯,反之,B表中的一條 數 據只能與A表中 一條資料相關聯 ex:老師(Teacher)與課程(Course) 一門課程可以被多個老師教 一個老師只能教一門課程 注意:在“多”表中增加外來鍵,引用自“一”表的主鍵 3、多對多 通過第三張關聯表去關聯兩張表 A表中的一條資料可以與B表中的任意多條資料相關聯,B表中的一條資料也 可以與A表中的任意多條資料相關聯
3、ORM的優點
1、封裝了資料庫中所有的操作,大大提高了開發效率
2、可以省略龐大的資料訪問層,即便不用SQL編碼也能完成對資料的CRUD的操作
三、Flask中的ORM框架
1、資料庫和框架配置
在python和Flask中,使用的ORM框架是 - SQLAlchemy
在Flask中使用SQLAlchemy,需要安裝:
pip3 install sqlalchemy
pip3 install flask-sqlalchemy
2、定義模型
模型:資料庫中的表在程式語言中的體現,其本質就是一個python類(模型類 或 實體類) 資料庫中的一行:實體 實體完整性:表中的實體不能完全重複 - 主鍵 語法: class MODELNAME(db.Model): __tablename__ = "TABLENAME" COLUMN_NAME = db.Column(db.TYPE,OPTIONS) 1、MODELNAME:定義模型類的名稱,根據表名設定 2、TABLENAME:對映到資料庫中表的名稱 3、COLUMN_NAME:屬性名,對映到資料表就是列名 4、TYPE:對映到列的資料型別 5、OPTIONS:列選項
db.TYPE 列型別如下:
型別名 python型別 說明
Integer int 普通整數,32位
SmallInteger int 小範圍整數,通常是16位
BigInteger int或long 不限精度整數
Float float 浮點數
Numeric decimal.Decimal 定點數
String str 變長字串
Text str 變長字串,優化
Unicode unicode 變長Unicode字串
UnicodeText unicode 優化後的變長Unicode字串
Boolean bool 布林值
Date datetime.date 日期
Time datetime.time 時間
DateTime datetime.datetime 時間和日期
OPTIONS 列選項:
選項名 說明
primary_key 如果設定為True表示該列為主鍵
unique 如果設定為True表示該列的值唯一
index 如果設定為True表示該列要建立索引
nullable 預設允許為空,如果設定為False表示該列不允許為空
default 表示該列的預設值
3、資料庫操作 - 插入
1、建立實體物件
2、完成插入
db.session.add(實體物件)
db.session.commit()
3、資料庫操作 - 查詢
1、基於db.session進行查詢
1、db.session.query()
該函式會返回一個Query物件,型別為BaseQuery
該物件中包含了實體類對應的表中的所有的資料
該函式可以接收一個或多個引數,引數表示的是要查詢的實體物件是誰
2、查詢執行函式
目的:在query()的基礎上得到最終想要的結果
語法:db.session.query(...).查詢執行函式()
函式 說明
all() 以列表的方式返回query()中的所有的查詢結果
first() 返回查詢結果中的第一個結果,若是沒有結果,則返回None
first_or_404() 返回查詢結果中的第一個結果,若是沒有結果,則終止並返 回404
count() 返回查詢結果的數量
3、查詢過濾器函式
作用:在查詢的基礎上,篩選部分行資料
語法:db.session.query(...).過濾器函式().查詢執行函式()
過濾器函式 說明
filter() 按指定條件進行過濾(多表,單表,定值,不定值)
filter_by() 按等值條件過濾時使用
limit() 按限制行數獲取
order_by() 根據指定條件進行排序
group_by() 根據指定條件進行分組
4、 過濾器函式詳解
1、filter()
注意:條件必須由 模型類. 屬性 構成
(1)查詢年齡大於30的Users的資訊
db.session.query(Users).filter(Users.age>30).all()
(2)查詢年齡大於30並且id大於1的Users的資訊
db.session.query(Users).filter(Users.age>30,Users.id>1)
(3)查詢年齡大於30 或者id大於1Users的資訊
db.session.query(Users).filter(or_(Users.age>30,Users.id>1)).all()
(4)查詢id為2 的Users的資訊
db.session.query(Users).filter(Users.id == 2).all()
(5)查詢 email 中包含'w'的Users的資訊 --- 模糊查詢
注意:模糊查詢like需要使用實體類中屬性提供的like()
db.session.query(Users).filter(Users.email.like('%w%')).all()
(6)查詢id在[2,3]之間的 Users的資訊
注意:需要使用實體類中的屬性提供的in_([])
db.session.query(Users).filter(Users.id.in_([2,3])).all()
2、聚合函式
db.session.query(func.聚合函式(列名).label("別名")).all()
3、filter_by()
查詢 id = 5的Users的資訊
db.session.query(Users).filter_by(id = 5).all()
4、limit offset查詢限制行資料
db.session.query(Users).limit(2).all()
db.session.query(Users).limit(2).offset(1).all()
5、order_by()
#按照id列的值降序排序
db.session.query(Users).order_by('id desc')
#按照age列的值降序排序,二級排序按照id升序排序
db.session.auery(Users).order_by("age desc,id asc")
6、group_by()
db.session.query(Users).group_by('age').all()
2、基於 Models 類進行查詢
1、基於db.session(略)
2、基於Models進行查詢
Models.query.查詢過濾器函式(條件引數).查詢執行函式()
3、刪除
1、查詢出要刪除的實體物件
u = db.session.query(Models).filter_by(xxx).first()
2、根據提供的刪除方法進行刪除
db.session.delete(u)
注意:真正的刪除時通過修改完成的,而不是通過刪除完成操作
4、修改
1、查
將要修改的資訊查詢出來
2、改
實體物件.屬性 = 值
3、儲存
db.session.add(實體物件)