2014-01-21 41 views
9

我使用瓶處理GoogleOpenID創建一個Web應用程序,這些代碼是基本完成,除閃爍的消息包含一個鏈接:如何使用Flask Flash刷新鏈接的消息?

@oid.after_login 
def create_or_login(resp): 
    user = db_session.query(User).filter_by(email=resp.email).first() 
    if user is not None: 
     flash('Successfully signed in', 'success') 
    else: 
     user = User(nickname=resp.fullname, source=GOOGLE, email=resp.email) 
     db_session.add(user) 
     db_session.commit() 
     flash(flashing_message, 'success') 
    g.user = user 
    session['nickname'] = user.nickname 
    return redirect(oid.get_next_url()) 

它運作良好時flashing_message是這樣的:'Successfully registered, please click here'

但是,當閃爍消息是'Successfully registered, please click <a href="/me" class="alert-link">here</a>',它不工作(閃爍什麼)沒有拋出任何錯誤。奇怪的是,flash()和return之間的句子無效(沒有設置session ['暱稱]或g.user)。

回答

1

轉義HTML是默認行爲,所以使其通過safe過濾器來顯示HTML轉義:

{{ message|safe }} 
+0

我試過這個,但不起作用。 – kxxoling

+0

@kxxoling:你得到什麼錯誤?你需要更具描述性。 – Blender

+0

因爲它不會拋出任何錯誤消息,我也很困惑。但是,我發現如果在閃爍的消息中有HTML標籤,那麼設置會話或g.user似乎不起作用。 – kxxoling

3

你需要調用flash()然後應該得到使用get_flashed_messages()的消息後,呈現模板。 您需要調整代碼以在調用flash()後調用模板。閃存會將消息發送到可以由模板提取的下一個請求。模板可以是這個樣子:

{% with messages = get_flashed_messages() %} 
    {% if messages %} 
    <ul class=flashes> 
    {% for message in messages %} 
     <li>{{ message | safe }}</li> 
    {% endfor %} 
    </ul> 
    {% endif %} 
{% endwith %} 

在您看來的代碼,我會閃光()調用之後添加一個render_template。喜歡的東西:

flash('success') 
return render_template('whatever.html') 
+0

是的,我知道如何使用flash(),當flashing_message是一個普通的字符串,但是當它'成功註冊,請點擊here',出錯了。 – kxxoling

0

我不知道這是否是正確的,但我解決了這個方式是通過聲明中,這是HTML的字符串函數的另一個變量,然後使其通過render_template()功能。

並在模板中通過safe過濾器。

例如,(大概基於)您所提供的代碼:在模板中我增加了一個額外

@oid.after_login 
def create_or_login(resp): 
    user = db_session.query(User).filter_by(email=resp.email).first() 
    if user is not None: 
     flash('Successfully signed in', 'success') 
    else: 
     user = User(nickname=resp.fullname, source=GOOGLE, email=resp.email) 
     db_session.add(user) 
     db_session.commit() 
     flash(flashing_message, 'success') 
     link = "<a href=\"some_link.html\">Link</a>" ## ADDED HTML WITH LINK ## 
    g.user = user 
    session['nickname'] = user.nickname 
    return render_template('some_layout.html', 
          link=link ## PASS THE LINK TO THE TEMPLATE ## 
    ) 

這時如果get_flashed_messages()如果裏面聲明:

{% with messages = get_flashed_messages(with_categories=true) %} 
    {% if messages %} 

    ... Code that was already here ... 

    {% if link %}  ## PASSED THE LINK TO THE TEMPLATE HERE ## 
     {{ link | safe }} 
    {% endif %} 

    {% endif %} 
{% endwith %} 
16

其他的答案這裏着重於更改您的模板以允許將所有Flash消息標記爲安全,這可能不是您想要的。

如果您只是想將某些閃存郵件標記爲安全,請將包含在標記()中傳遞給flash()的文本。 (Flask API Docs for Markup

例如,而不是:

flash('Successfully registered, please click <a href="/me" class="alert-link">here</a>') 

裹在標記()的字符串是這樣的:

flash(Markup('Successfully registered, please click <a href="/me" class="alert-link">here</a>')) 

與往常一樣,你需要從燒瓶包導入標記像這樣:

from flask import Markup 
+0

感謝您的回答,但燒瓶和忍者的使用沒有任何問題,但燒瓶openid插件有問題。 – kxxoling

+0

這是最好的答案。 – nathancahill