1 flask script擴展庫 概念 : 是一個flask終端運行的解析器 ,因為項目完成以後,代碼改動會有風險,所以藉助終端完成不同啟動項的配置 安裝 使用 執行程式需要在啟動項輸入命令 2 Blueprint藍圖 概念 : Blueprint通過把實現不同功能的module分開,實現分類功能 ...
1 flask-script擴展庫
概念: 是一個flask終端運行的解析器 ,因為項目完成以後,代碼改動會有風險,所以藉助終端完成不同啟動項的配置
安裝
pip3 install flask-script
使用
from flask_script import Manager #導入
manager = Manager(app) #初始化flask運行的解析器
manager.run() #運行
執行程式需要在啟動項輸入命令
python3 當前啟動文件名.py runserver 可選參數
可選參數如下:
-h 主機名
-p 埠號
--threaded 開啟多線程
-d 開啟調試模式
-r 代碼修改後重新載入
例如:
python3 manage.py runserver -d -r -h127.0.0.1 -p5001 --threaded 參數全部加上
2 Blueprint藍圖
概念 : Blueprint通過把實現不同功能的module分開,實現分類功能,從而把一個大的application分割成各自實現不同功能的module。在一個Blueprint中可以調用另一個blueprint的view function, 但要加相應的blueprint名。本質上來說就是讓程式更加松耦合,更加靈活,增加復用性,提高查錯效率.
導入
from flask import Blueprint,session
使用 : 創建藍圖路由文件userinfo.py文件
from flask import Blueprint
user = Blueprint('user',__name__)
@user.route('/login')
def login():
return 'login'
註意 : 1 Blueprint接受兩個參數實例化,分別文藍本名與藍本所在的包與模塊
2 藍本實質上也是一個命名空間
在啟動文件中註冊藍本: app/__init__.py
,一般在初始化時候註冊藍圖
from mysession import user
app.register_blueprint(user) #app註冊藍本user
app.register_blueprint(user,url_prefix='/user') #在app中註冊藍本user,並添上首碼/user
下麵我們以一個具體例子說明: 假定一個文件系統
--app
--main
__init__.py
errors.py
forms.py
views.py
__init__.py
其中mian就是藍本模塊,錯誤信息保存在errors.py,視圖函數保存在views.py文件中
(1) 創建藍本:
在文件app/main/__init__.py
添加定義:
from flask import Blueprint
main = Blueprint('admin',__name__)
from . import views,errors
註:1 通過實例化Blueprint類的對象創建一個藍本
2 視圖與errors的導入應放在藍本創建之後,防止迴圈導入問題
在文件app/main/views.py
中添加視圖函數:
from . import main #當前目錄下導入藍本
from flask import render_template
@main.route('/test/')
def test():
return render_template('main/test.html'),200
註: 1 跳轉到模板頁面test.html
在文件app/main/errors.py
中添加錯誤視圖函數:
from flask import render_template
from app.main import main #導入藍本
#捕捉404狀態碼
@main.app_errorhander(404)
def page_not_found(e):
return render_tamplate('main/404.html'),404
#捕捉500狀態碼
@main.app_errorhander(500)
def internal_server_error(e):
return render_template('main/500.html'),500
(2) 註冊藍本
在app/__init__.py
中添加註冊藍本代碼
from app.main import main #導入藍本
app.register_blueprint(main,url_prefix='/admin')
(3) 構造url路由
在view視圖中有函數test
url_for('main.test') url_for('藍本名.視圖函數名')
3 鉤子函數
類似於django中間件 在使用的時候需要使用裝飾器,使得 程式變成 A函數--->鉤子函數---->B函數
,
flask項目中有個是應用上下文(app),一個是請求上下文(request),請求上下文request和應用上下文current_app都是一個全局變數。所有請求都共用的。Flask有特殊的機制可以保證每次請求的數據都是隔離的,即A請求所產生的數據不會影響到B請求。所以可以直接導入request對象,不會受到外界影響
兩個上下文一般包含4個屬性:
- request : 請求上下文的對象,一般用來保存一些請求的變數。比如method、args、form等。
- session: 請求上下文的對象,一般用來保存一些會話信息.
- current_app: 返回當前App
- g: 全局變數,應用上下文的對象,處理請求時作為臨時存儲的對象 : g.message存儲信息
鉤子函數 | 功能描述 |
---|---|
before_first_request | 第一次請求之前 |
before_request | 每次請求之前 |
after_request | 每次請求之後 |
teardown_request | 不管是否異常都會在請求之後執行 |
context_processor | 上下文處理器,返回字典的健 |
errorhandler | errorhandler接收狀態碼,可以自定義返回狀態碼的響應頁面 |
註 : 在藍本中使用鉤子函數需要進行轉化: @mysession.teardown_app_request 藍本名.teardown_app_request
4 g對象
g : 全局變數,需要導入使用 from flask import g
- g對象專門用來保存用戶數據的
- g對象在一次請求中所有代碼都是公用的
例如: 在提交表單中測試下 action='{{ url_for('login') }}' method='post'
login_user.html
<form action="{{ url_for('login') }}" method="post">
<table>
<tr>
<td>用戶名:</td>
<td><input type="text" placeholder="請輸入用戶名" name="username"></td>
</tr>
<tr>
<td>密碼:</td>
<td><input type="text" placeholder="請輸入密碼" name="password"></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="登錄"></td>
</tr>
</table>
</form>
視圖函數utils.py中
from flask import g
def login_username():
return u'當前登錄用戶:{}'.format(g.username)
def login_password():
return u'當前密碼:{}'.format(g.password)
在主文件視圖函數中views.py
from flask import Flask,g,request,render_template
from utils import login_username
app = Flask(__name__)
@app.route('/login/',methods=['GET', 'POST'])
def login():
if request.method == 'GET':
return render_template('login.html')
else:
username = request.form.get('username')
password = request.form.get('password')
g.username = username #將username變成全局g對象信息存儲
g.password = password #將password變成全局g對象信息存儲
login_username()
login_password()
return u'登錄成功!'
if __name__ == '__main__':
app.run()