1. 程式人生 > >Flask入門flask-script 藍本 鉤子函數(三)

Flask入門flask-script 藍本 鉤子函數(三)

啟動文件 直接 對象信息 all views request對象 全局 func flask

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個屬性:

  1. request : 請求上下文的對象,一般用來保存一些請求的變量。比如method、args、form等。
  2. session: 請求上下文的對象,一般用來保存一些會話信息.
  3. current_app: 返回當前App
  4. 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

  1. g對象專門用來保存用戶數據的
  2. 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()

Flask入門flask-script 藍本 鉤子函數(三)