閃現, 請求擴充套件, 藍圖, 中介軟體(瞭解)

weixin_34148340發表於2019-02-18

目錄

  1. 閃現
  2. 請求擴充套件
  3. 中介軟體(瞭解)
  4. 藍圖

9.閃現(message)

-設定:flash('aaa')
-取值:get_flashed_message()
-假設在a頁面操作出錯,跳轉到b頁面,在b頁面顯示a頁面的錯誤資訊

示例:

from flask import Flask,flash,get_flashed_messages,request,redirect

app = Flask(__name__)
app.secret_key = 'asdfasdf'


@app.route('/index')
def index():
    # 從某個地方獲取設定過的所有值,並清除。
    val = request.args.get('v')
    if val == 'oldboy':
        return 'Hello World!'
    flash('超時錯誤',category="x1")
    return "ssdsdsdfsd"
    # return redirect('/error')


@app.route('/error')
def error():
    """
    展示錯誤資訊
    :return:
    """
    data = get_flashed_messages(category_filter=['x1'])
    if data:
        msg = data[0]
    else:
        msg = "..."
    return "錯誤資訊:%s" %(msg,)

if __name__ == '__main__':
    app.run()

10.請求擴充套件

1 before_request

類比django中介軟體中的process_request,在請求收到之前繫結一個函式做一些事情

#基於它做使用者登入認證
@app.before_request
def process_request(*args,**kwargs):
    if request.path == '/login':
        return None
    user = session.get('user_info')
    if user:
        return None
    return redirect('/login')

2 after_request

類比django中介軟體中的process_response,每一個請求之後繫結一個函式,如果請求沒有異常

@app.after_request
def process_response1(response):
    print('process_response1 走了')
    return response

3 before_first_request

第一次請求時,跟瀏覽器無關

@app.before_first_request
def first():
    pass

4 teardown_request

每一個請求之後繫結一個函式,即使遇到了異常

@app.teardown_request 
def ter(e):
    pass

5 errorhandler

路徑不存在時404,伺服器內部錯誤500

@app.errorhandler(404)
def error_404(arg):
    return "404錯誤了"

6 template_global

標籤

@app.template_global()
def sb(a1, a2):
    return a1 + a2
#{{sb(1,2)}}

7 template_filter

過濾器

@app.template_filter()
def db(a1, a2, a3):
    return a1 + a2 + a3
#{{ 1|db(2,3)}}

總結:

1 重點掌握before_request和after_request,

2 注意有多個的情況,執行順序

3 before_request請求攔截後(也就是有return值),response所有都執行

11 中介軟體(瞭解)

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello World!'
# 模擬中介軟體
class Md(object):
    def __init__(self,old_wsgi_app):
        self.old_wsgi_app = old_wsgi_app

    def __call__(self,  environ, start_response):
        print('開始之前')
        ret = self.old_wsgi_app(environ, start_response)
        print('結束之後')
        return ret

if __name__ == '__main__':
    #把原來的wsgi_app替換為自定義的
    app.wsgi_app = Md(app.wsgi_app)
    app.run()

12.藍圖

對程式進行目錄結構劃分

不使用藍圖,自己分檔案

目錄結構:

-templates
-views
    -__init__.py
    -user.py
    -order.py
-app.py

app.py

from views import app
if __name__ == '__main__':
    app.run()

init.py

from flask import Flask,request
app = Flask(__name__)
#不匯入這個不行
from . import account
from . import order
from . import user

user.py

from . import app
@app.route('/user')
def user():
    return 'user'

order.py

from . import app
@app.route('/order')
def order():
    return 'order'

使用藍圖之中小型系統

詳見程式碼:pro_flask_簡單應用程式目錄示例.zip

目錄結構:

-flask_pro
    -flask_test
        -__init__.py
        -static
        -templates
        -views
            -order.py
            -user.py
     -manage.py 
        

_init.py

from flask import  Flask
app=Flask(__name__)
from flask_test.views import user
from flask_test.views import order
app.register_blueprint(user.us)
app.register_blueprint(order.ord)

manage.py

from flask_test import  app
if __name__ == '__main__':
    app.run(port=8008)

user.py

from flask import Blueprint
us=Blueprint('user',__name__)

@us.route('/login')
def login():
    return 'login'

order.py

from flask import Blueprint
ord=Blueprint('order',__name__)

@ord.route('/test')
def test():
    return 'order test'

使用藍圖之大型系統

詳見程式碼:pro_flask_大型應用目錄示例.zip

總結:

1 xxx = Blueprint('account', name,url_prefix='/xxx') :藍圖URL字首,表示url的字首,在該藍圖下所有url都加字首

2 xxx = Blueprint('account', name,url_prefix='/xxx',template_folder='tpls'):給當前藍圖單獨使用templates,向上查詢,當前找不到,會找總templates

3 藍圖的befort_request,對當前藍圖有效

4 大型專案,可以模擬出類似於django中app的概念

相關文章