flask框架(六)——閃現(get_flashed_message)、請求擴展、中間件(了解)


message

-設置:flash('aaa')
-取值:get_flashed_message()

-假設在a頁面操作出錯,跳轉到b頁面,在b頁面顯示a頁面的錯誤信息
1 如果要用flash就必須設置app.secret_key = 'asdfasdf'
2 特點:存了,你可以在任意一次請求中獲取,但是一旦取了一次,就沒有了。這里的一次指的是在同一個路徑下請求一次
3 我們可以使用  flash('普通信息',category="info"),通過category對信息做分類
4get_flashed_messages(with_categories=True,category_filter=("error",)),設置with_categories以鍵值對的形式獲取
設置category_filter=("error",)進行分類信息的過濾
代碼示例
from
flask import Flask,flash,get_flashed_messages app = Flask(__name__) app.secret_key = 'asdfasdf' @app.route('/index1') def index(): #(category="message", message)) flash('超時錯誤',category="error") #設置信息,分類為error flash('普通信息',category="info") #設置信息,分類為info return "ssdsdsdfsd" @app.route('/error') def error(): data = get_flashed_messages(with_categories=True,category_filter=("error","info")) data1 = get_flashed_messages(with_categories=True, category_filter=("error", "info")) print("data1",data1) print("data",data) return "錯誤信息" if __name__ == '__main__': app.run()

操作流程

請求index1路由,執行flash,設置信息,並且分類
請求error路由,執行get_flash_message。with_categories參數可寫可不寫,寫了參數就是(類型,設置信息)格式。category_filter是設置顯示的哪個分類信息

設置with_categories=True,結果打印格式

 

不設置with_categories=True,結果打印格式

請求擴展

1.before_request  在訪問正式的視圖函數之前做一些事情(比如可以基於它做用戶登錄)

注意:如果你在一個before中加入return返回值,就會終止代碼運行,不會往下走了。

from flask import Flask,request,render_template
app = Flask(__name__)

@app.before_request
def befor1():
    print(request)
    print("我是請求之前1")
    
@app.before_request
def befor2():
    print("我是請求之前2")

@app.route('/index')
def index():
    print("我是真的視圖")
    return render_template("index.html")

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

結果是從上往下運行

 2.after_request  (在每個請求之后綁定一個函數,類似於django中間件中的process_response)

from flask import Flask,request,render_template
app = Flask(__name__)

@app.after_request
def after1(response):
    print("我是請求之后1")
    return response

@app.after_request
def after2(response):
    print("我是請求之后2")
    return response

@app.route('/index')
def index():
    print("我是真的視圖")
    return render_template("index.html")


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

結果是從下往上運行

3.before_first_request   (在請求之前運行,如果不重啟,只會運行第一次)

from flask import Flask,render_template
app = Flask(__name__)

@app.before_first_request
def before_first():
    print("123")


@app.route('/index')
def index():
    print("我是真的視圖")
    return render_template("index.html")


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

4.teardown_request  (在正式請求之后綁定一個函數,無論有沒有異常都會執行,如果沒有異常這個參數e就返回None,有就記錄這個異常)

from flask import Flask,render_template
app = Flask(__name__)

@app.teardown_request
def tear(e):
    print('teardown_request')
    print(e)   #返回異常信息
 
@app.route('/index')
def index():
    print("我是真的視圖")
    return render_template("index.html")


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

5.errorhandler   (路徑不存在時404,服務器內部錯誤500)

@app.errorhandler(404)
def error_404(arg):
    print(arg)   #返回路徑錯誤信息 return "404錯誤了"


@app.errorhandler(500)
def error(arg):
    print(arg)   #返回服務器錯誤信息 return "500錯誤了"

6.template_global   (標簽)

@app.template_global()
def sb(a1, a2):
    return a1 + a2

@app.route('/index')
def index():
    print("我是真的視圖")
    return render_template("index.html")

html

{{sb(1,2)}}

7.template_filter  (過濾器)

@app.template_filter()
def db(a1, a2, a3):
    return a1 + a2 + a3

html
#{{ 1|db(2,3)}}

總結:

1 重點掌握before_request和after_request,

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

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

中間件(了解)

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__':
    #1我們發現當執行app.run方法的時候,最終執行run_simple,最后執行app(),也就是在執行app.__call__方法 
    #2 在__call__里面,執行的是self.wsgi_app().那我們希望在執行他本身的wsgi之前做點事情。
    #3 所以我們先用Md類中__init__,保存之前的wsgi,然后我們用將app.wsgi轉化成Md的對象。
    #4 那執行新的的app.wsgi_app,就是執行Md的__call__方法。
    #把原來的wsgi_app替換為自定義的,
    
    app.wsgi_app = Md(app.wsgi_app)
    app.run()

請求所有的流程

ctx = self.request_context(environ)
        error = None
        try:
            try:
                ctx.push()
                #根據路徑去執行視圖函數,視圖類
                response = self.full_dispatch_request()
            except Exception as e:
                error = e
                response = self.handle_exception(e)
            except:  # noqa: B001
                error = sys.exc_info()[1]
                raise
            return response(environ, start_response)
        finally:
            #不管出不出異常,都會走這里
            if self.should_ignore_error(error):
                error = None
            ctx.auto_pop(error)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM