1. 程式人生 > >Flask專案筆記

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 response
csrf_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) 版本號