Flask09--閃現 , g對象,信號


1 閃現

Flask 提供了一個非常簡單的方法來使用閃現系統向用戶反饋信息。閃現系統使得在一個請求結束的時候記錄一個信息,然后在且僅僅在下一個請求中訪問這個數據,強調flask閃現是基於flask內置的session的,利用瀏覽器的session緩存閃現信息。所以必須設置secret_key

1.1.1 簡單的在模板中實現獲取閃現信息

設置閃現內容:flash('恭喜您登錄成功')
模板取出閃現內容:{% with messages = get_flashed_messages() %}  取出的值是列表 可以進一步循環 {% for message in messages%}
			<p>message</p>
      {% endfor%}

1.1.2 模板中的分類閃現

當閃現一個消息時,是可以提供一個分類的。未指定分類時默認的分類為 'message' 。 可以使用分類來提供給用戶更好的反饋,可以給用戶更精准的提示信息體驗。

要使用一個自定義的分類,只要使用 flash() 函數的第二個參數:

flash('恭喜您登錄成功',"status")
flash('您的賬戶名為admin',"username")

在使用get_flashed_messages()時候需要傳入with_categories=true便可以渲染出來類別

模板中的分類閃現小結:

分類設置閃現內容:flash('恭喜您登錄成功',"status")
		    flash('您的賬戶名為admin',"username")
模板取值:   {% with messages = get_flashed_messages(with_categories=true) %}
            {% if messages %}
            <ul class=flashes>
            {% for category, message in messages %}
            ...
    

1.1.3 模板中過濾閃現消息

同樣要使用一個自定義的分類,只要使用 flash() 函數的第二個參數:

Copyflash('恭喜您登錄成功',"status")
flash('您的賬戶名為admin',"username")

在使用get_flashed_messages()時候需要傳入category_filter=["username"]便可根據類別取出閃現信息。中括號內可以傳入的值就是類別,可以傳入多個。

分類設置閃現內容:flash('恭喜您登錄成功',"status")
		    flash('您的賬戶名為admin',"username")
模板取值:{% with messages = get_flashed_messages(category_filter=["username"])%}
            {% if messages %}
              <ul>
                {%- for message in messages %}
            				...

1.2 在視圖中獲取閃現信息

-設置: flash('xxx')
-取值:get_flashed_message() # 注意這個不同於模板取值,這個是從flask中導入的
-注意:在視圖中獲取閃現信息不必非得是兩次連續的請求,只要保證是第一次取相應的閃現信息,就可以取得到。

1.2.1 在視圖中實現分類獲取閃現信息。

-設置:flash('用戶名錯誤', "username_error")
      flash('用戶密碼錯誤', "password_error") # 第二個參數為閃現信息的分類。

-取所有閃現信息的類別和閃現內容:get_flashed_messages(with_categories=True)
    
-針對分類過濾取值:get_flashed_messages(category_filter=['username_error']) 
			      # 中括號內可以寫多個分類。
    
-注意:如果flash()沒有傳入第二個參數進行分類,默認分類是 'message'
  

2.全局 g 對象

from flask import g

放 g.name = 'lqw'
取  res = g.name

注意:
	專門用來存儲用戶信息的g對象,g的全稱的為global
	g對象在一次請求中的所有的代碼的地方,都是可以使用的

2.1 g和session的區別

  session對象是可以跨request的,只要session還未失效,不同的request的請求會獲取到同一個session,但是g對象不是,g對象不需要管過期時間,請求一次就g對象就改變了一次,或者重新賦值了一次

3.信號

Flask框架中的信號基於blinker,其主要就是讓開發者可是在flask請求過程中定制一些用戶行為

安裝:pip3 install blinker

內置信號:

request_started = _signals.signal('request-started')        # 請求到來前執行
request_finished = _signals.signal('request-finished')      # 請求結束后執行
before_render_template = _signals.signal('before-render-template')# 模板渲染前執行
template_rendered = _signals.signal('template-rendered')       # 模板渲染后執行
got_request_exception = _signals.signal('got-request-exception')#請求執行出現異常執
request_tearing_down = _signals.signal('request-tearing-down') # 請求執行完畢后自動執行(無論成功與否)
appcontext_tearing_down = _signals.signal('appcontext-tearing-down')# 應用上下文執行完畢后自動執行(無論成功與否)
appcontext_pushed = _signals.signal('appcontext-pushed') # 應用上下文push時執行
appcontext_popped = _signals.signal('appcontext-popped') # 應用上下文pop時執行
message_flashed = _signals.signal('message-flashed') # 調用flask在其中添加數據時,自動觸發

使用信號:

from flask import Flask,signals,render_template
app = Flask(__name__)
# 往信號中注冊函數
def func(*args,**kwargs):
    print('觸發型號',args,kwargs)
signals.request_started.connect(func)
# 觸發信號:signals.request_started.send()
@app.before_first_request
def before_first1(*args,**kwargs):
    pass
@app.before_first_request
def before_first2(*args,**kwargs):
    pass

@app.before_request
def before_first3(*args,**kwargs):
    pass

@app.route('/',methods=['GET',"POST"])
def index():
    print('視圖')
    return render_template('index.html')


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

一個流程中的信號觸發點(了解)

a. before_first_request
b. 觸發 request_started 信號
c. before_request
d. 模板渲染
	渲染前的信號 before_render_template.send(app, template=template, context=context)
		rv = template.render(context) # 模板渲染
	渲染后的信號 template_rendered.send(app, template=template, context=context)
e. after_request
f. session.save_session()
g. 觸發 request_finished信號		
	如果上述過程出錯:
		觸發錯誤處理信號 got_request_exception.send(self, exception=e)
			
h. 觸發信號 request_tearing_down

自定義信號(了解):

from flask import Flask, current_app, flash, render_template
from flask.signals import _signals
app = Flask(import_name=__name__)

# 自定義信號
xxxxx = _signals.signal('xxxxx')
 
def func(sender, *args, **kwargs):
    print(sender)
# 自定義信號中注冊函數
xxxxx.connect(func)
注意:
    信號是同步的,自定義信號感覺沒啥用,為何不直接使用函數呢???django的信號也是同步的

 


免責聲明!

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



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