Flask專案筆記
一、jsonify
jsonify 是flask的函式,可以將字典轉換成json資料返回給瀏覽器
二、 鉤子函式
@app.before_first_request:第一次請求呼叫,用於初始化資料
@app.before_request:每次請求呼叫
@app.after-request:每次請求後呼叫
@app.teardown_request:異常發生後呼叫
about(400):捕獲異常,終止函式,返回狀態碼
@app.errorhandler(400):捕獲異常,返回相應資訊
三、模板語言中的過濾器:
用法:{{ param|capitalize }}
capitalize:首字母大寫
upper:大寫
lower:小寫
reverse:反轉
safe:告知瀏覽器變數中的內容是安全的
4.自定義過濾器:
1.在試圖模組中定義過濾器函式
2.使用app.add_template_filter(過濾器函式名,'list_name')
3.用法:{{ param|list_name }}
四、配置檔案相關內容
1 # 配置檔案 2 class Config(object): 3 # debug模式配置 4 # DEBUG=True 5 LOG_LEVEL = logging.DEBUG 6 # mysql 配置 7 SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:[email protected]:3306/news' 8 SQLALCHEMY_TRACK_MODIFICATIONS = False 9 SQLALCHEMY_ECHO = True配置10 # redis 配置資訊 11 REDIS_HOST = '127.0.0.1' 12 REDIS_PORT = 6379 13 # session 配置 14 SESSION_TYPE = 'redis' 15 SESSION_USE_SIGNER = True 16 SESSION_REDIS = StrictRedis(host=REDIS_HOST, port=REDIS_PORT,db=1) 17 PERMANENT_SESSION_LIFETIME = 3600 18 SECRET_KEY = 'KZtgoZECnZyp/hiU49YHotf2Nv4IGYqF5I7M6K3iClzvTWYtALha9E2i7wgIK78X'
五、csrf_token設定
1 @app.after_request 2 def after_request(response): 3 from flask_wtf.csrf import generate_csrf 4 csrf_token = generate_csrf() 5 response.set_cookie('csrf_token', csrf_token) 6 return responsecsrf_token
六、404頁面
@app.errorhandler(404) @user_login_data def page_not_found(_): user=g.user data={'user_info':user.to_dict() if user else None} return render_template('news/404.html',data=data)404
七、orm
1.orm-select
1 from flask import Flask 2 from flask_sqlalchemy import SQLAlchemy 3 4 app=Flask(__name__) 5 # app.cofig['SQLALCHEMY_DATABASE_URI']='' 6 # 設定資料庫的連線選項 7 # 語法形式: mysql://username:[email protected]:port/dbname 8 # mysql://root:[email protected]:3306/db_34 9 app.config.setdefault('SQLALCHEMY_DATABASE_URI', 'mysql://root:[email protected]:3306/db') 10 11 # SQLALCHEMY_TRACK_MODIFICATIONS 12 # 是否設定跟蹤模式,這個跟蹤模式是需要消耗資源的 所以我們給它設定位False 13 # 預設值 位None,系統會發出一個警告 14 app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=False 15 16 # 讓sql語句輸出在控制檯 17 app.config['SQLALCHEMY_ECHO']=False 18 19 #建立SQLAlchemy的例項物件 20 # app 引數: 就是 flask的例項物件 21 db = SQLAlchemy(app=app) 22 23 24 # 資料庫中的一個表就需要對應我們的 一個模型 25 """ 26 1.模型需要繼承自 db.Model 27 2.定義欄位(屬性) 28 欄位名: 不要使用python關鍵字 不要用mysql關鍵字 29 欄位型別: 其實是和mysql類似的 30 欄位選項: 31 primary_key :預設設定主鍵 會自動增長 32 unique 33 nullable 34 default 35 """ 36 class BookInfo(db.Model): 37 38 #修改表明 39 __tablename__='bookinfo' 40 41 # 主鍵 42 id=db.Column(db.Integer,primary_key=True) 43 44 name=db.Column(db.String(20),unique=True,nullable=False) 45 #釋出日期 46 pub_date=db.Column(db.Date,nullable=True) 47 #閱讀量 48 readcount=db.Column(db.Integer,default=0) 49 #評論量 50 commentcount=db.Column(db.Integer,default=0) 51 #是否刪除 52 is_delete=db.Column(db.Boolean,default=False) 53 54 55 class PeopleInfo(db.Model): 56 __tablename__ = 'peopleinfo' 57 id = db.Column(db.Integer,primary_key=True) 58 name = db.Column(db.String(20),unique=True) 59 password = db.Column(db.String(20),nullable=False) 60 email = db.Column(db.String(50),nullable=True) 61 62 #設定外來鍵 63 book_id = db.Column(db.Integer,db.ForeignKey(BookInfo.id)) 64 # book_id = db.Column(db.Integer,db.ForeignKey('bookinfo.id')) 65 66 67 def __repr__(self): 68 return '------%s------'%self.name 69 """ 70 一本書中 有多個人物 71 id name readcount commentcount 72 1 西遊記 100 73 74 75 id name password book_id 76 1 孫悟空 123 1 77 2 白骨精 321 1 78 79 """ 80 81 82 @app.route('/') 83 def index(): 84 return 'index' 85 86 if __name__ == '__main__': 87 88 # 刪除表,刪除 繼承自 db.Model的類 的表 89 db.drop_all() 90 91 # db.create_all 就會給 繼承自 db.Model的類 建立表 92 db.create_all() 93 94 95 #資料插入 96 # 第一種方式 97 book1=BookInfo(name='西遊記',readcount=100) 98 99 #新增資料 100 """ 101 事務 -- 就是保證資料操作的一致性 102 103 """ 104 try: 105 db.session.add(book1) 106 db.session.commit() 107 except Exception as e: 108 db.session.rollback() 109 110 # 新增資料的第二種方式 111 book2=BookInfo() 112 book2.name='紅樓夢' 113 book2.commentcount=1000 114 115 116 try: 117 #如果新增每天問題 則提交資料(類似於事務) 118 db.session.add(book2) 119 db.session.commit() 120 except Exception as e: 121 # 如果有問題 則資料回滾 不回新增成功 122 db.session.rollback() 123 124 p1 = PeopleInfo(name='wang', email='[email protected]', password='123456', book_id=book1.id) 125 p2 = PeopleInfo(name='zhang', email='[email protected]', password='201512', book_id=book2.id) 126 p3 = PeopleInfo(name='chen', email='[email protected]', password='987654', book_id=book2.id) 127 p4 = PeopleInfo(name='zhou', email='[email protected]', password='456789', book_id=book1.id) 128 p5 = PeopleInfo(name='tang', email='[email protected]', password='158104', book_id=book2.id) 129 p6 = PeopleInfo(name='wu', email='[email protected]', password='5623514', book_id=book2.id) 130 p7 = PeopleInfo(name='qian', email='[email protected]', password='1543567', book_id=book1.id) 131 p8 = PeopleInfo(name='liu', email='[email protected]', password='867322', book_id=book1.id) 132 p9 = PeopleInfo(name='li', email='[email protected]', password='4526342', book_id=book2.id) 133 p10 = PeopleInfo(name='sun', email='[email protected]', password='235523', book_id=book2.id) 134 135 # 新增一個列表 136 db.session.add_all([p1, p2, p3, p4, p5, p6, p7, p8, p9, p10]) 137 db.session.commit() 138 139 140 141 142 143 #########################查詢##################################### 144 """ 145 查詢的語法形式: 模型類.query.[過濾器].執行器 146 query: 就是 模型類的管理 147 148 過濾器(where): filter, filter_by,order_by,goup_by 149 過濾器 不能把結果給我們 它只能給我們地址 150 151 filter(模型類名.欄位 == 值) 152 filter_by(欄位名=值) 153 154 執行器(獲取資料): get,all,first 155 all: 獲取查詢的所有資料 156 first: 獲取查詢的第一個資料 157 count:個數 158 get(pk): primayr_key (pk) 通過主鍵獲取 記錄 159 """ 160 161 # 查詢所有人物資料 162 PeopleInfo.query.all() 163 # 查詢有多少個人物 164 PeopleInfo.query.count() 165 # 查詢第1個人物 166 PeopleInfo.query.first() 167 168 # 查詢id為4的人物[3種方式] 169 # where id=4 170 PeopleInfo.query.get(4) 171 172 # filter_by 等值過濾器 = 173 PeopleInfo.query.filter_by(id=4).first() 174 175 # filter == 過濾器 176 PeopleInfo.query.filter(PeopleInfo.id==4).first() 177 178 # 查詢名字結尾字元為g的所有資料[開始/包含] 179 PeopleInfo.query.filter(PeopleInfo.name.endswith('g')).all() 180 PeopleInfo.query.filter(PeopleInfo.name.startswith('g')).all() 181 PeopleInfo.query.filter(PeopleInfo.name.contains('g')).all() 182 # 查詢名字不等於wang的所有資料[2種方式] 183 PeopleInfo.query.filter(PeopleInfo.name!='wang').all() 184 from sqlalchemy import not_ 185 PeopleInfo.query.filter(not_(PeopleInfo.name=='wang')).all() 186 187 # 查詢名字和郵箱都以 li 開頭的所有資料[2種方式] 188 # and 189 from sqlalchemy import and_ 190 PeopleInfo.query.filter(and_(PeopleInfo.name.startswith('li'),PeopleInfo.email.startswith('li'))).all() 191 192 193 PeopleInfo.query.filter(PeopleInfo.name.startswith('li'),PeopleInfo.email.startswith('li')) 194 195 # 查詢password是 `123456` 或者 `email` 以 `itheima.com` 結尾的所有資料 196 from sqlalchemy import or_ 197 #錯誤的 198 PeopleInfo.query.filter(or_(PeopleInfo.password=='123456'),PeopleInfo.email.endswith('itheima.com')).all() 199 200 #正確的 201 PeopleInfo.query.filter(or_(PeopleInfo.password=='123456',PeopleInfo.email.endswith('itheima.com'))).all() 202 203 # 查詢id為 [1, 3, 5, 7, 9] 的人物列表 204 # select * from peopleinfo werhe id in (1,3,5,7,9) 205 PeopleInfo.query.filter(PeopleInfo.id.in_([1,3,5,7,9])).all() 206 # 查詢name為liu的人物資料 207 PeopleInfo.query.filter(PeopleInfo.name=='liu').all() 208 PeopleInfo.query.filter_by(name='liu').all() 209 # 查詢所有人物資料,並以郵箱排序 210 PeopleInfo.query.order_by(PeopleInfo.email.desc()).all() 211 PeopleInfo.query.order_by(PeopleInfo.email.asc()).all() 212 213 PeopleInfo.query.all().order_by(PeopleInfo.email.desc()) 214 215 # 每頁3個,查詢第2頁的資料 216 # page=None, 頁數 217 # per_page=None 每頁多少條 218 paginate = PeopleInfo.query.paginate(page=2,per_page=3) 219 #獲取所有(第2頁的)資料 220 paginate.items 221 # 獲取有多少頁 222 paginate.pages 223 #獲取當前的頁數 224 paginate.page 225 226 app.run()select
2.orm-insert
1 from flask import Flask 2 from flask_sqlalchemy import SQLAlchemy 3 4 app=Flask(__name__) 5 # app.cofig['SQLALCHEMY_DATABASE_URI']='' 6 # 設定資料庫的連線選項 7 # 語法形式: mysql://username:[email protected]:port/dbname 8 # mysql://root:[email protected]:3306/db_34 9 app.config.setdefault('SQLALCHEMY_DATABASE_URI', 'mysql://root:[email protected]:3306/db') 10 11 # SQLALCHEMY_TRACK_MODIFICATIONS 12 # 是否設定跟蹤模式,這個跟蹤模式是需要消耗資源的 所以我們給它設定位False 13 # 預設值 位None,系統會發出一個警告 14 app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=False 15 16 # 讓sql語句輸出在控制檯 17 app.config['SQLALCHEMY_ECHO']=True 18 19 #建立SQLAlchemy的例項物件 20 # app 引數: 就是 flask的例項物件 21 db = SQLAlchemy(app=app) 22 23 24 # 資料庫中的一個表就需要對應我們的 一個模型 25 """ 26 1.模型需要繼承自 db.Model 27 2.定義欄位(屬性) 28 欄位名: 不要使用python關鍵字 不要用mysql關鍵字 29 欄位型別: 其實是和mysql類似的 30 欄位選項: 31 primary_key :預設設定主鍵 會自動增長 32 uniue 33 nullable 34 default 35 """ 36 class BookInfo(db.Model): 37 38 #修改表明 39 __tablename__='bookinfo' 40 41 # 主鍵 42 id=db.Column(db.Integer,primary_key=True) 43 44 name=db.Column(db.String(20),unique=True,nullable=False) 45 #釋出日期 46 pub_date=db.Column(db.Date,nullable=True) 47 #閱讀量 48 readcount=db.Column(db.Integer,default=0) 49 #評論量 50 commentcount=db.Column(db.Integer,default=0) 51 #是否刪除 52 is_delete=db.Column(db.Boolean,default=False) 53 54 55 class PeopleInfo(db.Model): 56 __tablename__ = 'peopleinfo' 57 id = db.Column(db.Integer,primary_key=True) 58 name = db.Column(db.String(20),unique=True) 59 password = db.Column(db.String(20),nullable=False) 60 email = db.Column(db.String(50),nullable=True) 61 62 #設定外來鍵 63 book_id = db.Column(db.Integer,db.ForeignKey(BookInfo.id)) 64 # book_id = db.Column(db.Integer,db.ForeignKey('bookinfo.id')) 65 66 """ 67 一本書中 有多個人物 68 id name readcount commentcount 69 1 西遊記 100 70 71 72 id name password book_id 73 1 孫悟空 123 1 74 2 白骨精 321 1 75 76 """ 77 78 79 @app.route('/') 80 def index(): 81 return 'index' 82 83 if __name__ == '__main__': 84 85 # 刪除表,刪除 繼承自 db.Model的類 的表 86 db.drop_all() 87 88 # db.create_all 就會給 繼承自 db.Model的類 建立表 89 db.create_all() 90 91 92 #資料插入 93 # 第一種方式 94 book1=BookInfo(name='西遊記',readcount=100) 95 96 #新增資料 97 """ 98 事務 -- 就是保證資料操作的一致性 99 100 """ 101 try: 102 db.session.add(book1) 103 db.session.commit() 104 except Exception as e: 105 db.session.rollback() 106 107 # 新增資料的第二種方式 108 book2=BookInfo() 109 book2.name='紅樓夢' 110 book2.commentcount=1000 111 112 113 try: 114 #如果新增每天問題 則提交資料(類似於事務) 115 db.session.add(book2) 116 db.session.commit() 117 except Exception as e: 118 # 如果有問題 則資料回滾 不回新增成功 119 db.session.rollback() 120 121 p1 = PeopleInfo(name='wang', email='[email protected]', password='123456', book_id=book1.id) 122 p2 = PeopleInfo(name='zhang', email='[email protected]', password='201512', book_id=book2.id) 123 p3 = PeopleInfo(name='chen', email='[email protected]', password='987654', book_id=book2.id) 124 p4 = PeopleInfo(name='zhou', email='zho[email protected]', password='456789', book_id=book1.id) 125 p5 = PeopleInfo(name='tang', email='[email protected]', password='158104', book_id=book2.id) 126 p6 = PeopleInfo(name='wu', email='[email protected]', password='5623514', book_id=book2.id) 127 p7 = PeopleInfo(name='qian', email='[email protected]', password='1543567', book_id=book1.id) 128 p8 = PeopleInfo(name='liu', email='[email protected]', password='867322', book_id=book1.id) 129 p9 = PeopleInfo(name='li', email='[email protected]', password='4526342', book_id=book2.id) 130 p10 = PeopleInfo(name='sun', email='[email protected]', password='235523', book_id=book2.id) 131 132 # 新增一個列表 133 db.session.add_all([p1, p2, p3, p4, p5, p6, p7, p8, p9, p10]) 134 db.session.commit() 135 136 app.run()insert
八、資料庫遷移
1.python 檔案 db init
2.python 檔案 db migrate -m"版本名(註釋)"
3.python 檔案 db upgrade 然後觀察表結構
4.根據需求修改模型
5.python 檔案 db migrate -m"新版本名(註釋)"
6.python 檔案 db upgrade 然後觀察表結構
7.若返回版本,則利用 python 檔案 db history檢視版本號
8.python 檔案 db downgrade(upgrade) 版本號