2014-01-21 12 views
9

Ich erstelle eine Web-App-Flasche mit mit GoogleOpenID beschäftigen, sind diese Codes fast fertig, mit Ausnahme der blinkende Nachricht enthält einen Link:Wie blitze ich eine Nachricht mit einem Link mit 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()) 

Es funktioniert gut, wenn flashing_message ist wie folgt: 'Successfully registered, please click here'

Aber wenn flashing_message ist , es funktioniert nicht (blinkt nichts) ohne einen Fehler zu werfen. Seltsamerweise funktionieren auch Sätze zwischen flash() und return nicht (Session ['nickname] oder g.user wurde nicht gesetzt).

Antwort

1

Escaping HTML ist das Standardverhalten, so führt es durch den safe Filter den HTML unescaped anzuzeigen:

{{ message|safe }} 
+0

Ich habe das versucht, aber funktioniert nicht. – kxxoling

+0

@ kxxoling: Welchen Fehler bekommst du? Sie müssen beschreibender sein. – Blender

+0

weil es keine Fehlermeldung wirft, bin ich auch sehr verwirrt.Aber ich fand, wenn es HTML-Tag in blinkender Nachricht gibt, scheint es nicht funktionieren, um Sitzung oder g.user einzustellen. – kxxoling

3

Sie benötigen eine Vorlage zu machen, nachdem flash() Aufruf, die dann die Nachricht get_flashed_messages() mit bekommen sollte. Sie müssen Ihren Code anpassen, um nach dem Aufrufen von flash() eine Vorlage aufzurufen. Flash sendet die Nachricht an die nächste Anfrage, die von der Vorlage extrahiert werden kann. Die Vorlage kann etwas wie folgt aussehen:

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

Ihrer Ansicht Code, würde ich einen render_template direkt nach dem Blitz() Anruf hinzuzufügen. Etwas wie:

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

Ja, ich weiß, wie man flash() verwendet, es ist in Ordnung, wenn flashing_message eine normale Zeichenfolge ist, aber wenn es erfolgreich registriert wurde, klicken Sie bitte here, etwas ging schief. – kxxoling

0

Ich bin nicht sicher, ob es richtig ist, aber die Art, wie ich dieses Problem gelöst war durch eine andere Variable in der Funktion deklariert, die eine Reihe von HTML war und dann durch eine render_template() Funktion übergeben.

Und in der Vorlage bestanden es durch die safe Filter.

Zum Beispiel (etwa basierend auf) der Code, den Sie zur Verfügung gestellt haben:

@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 ## 
    ) 

Dann in der Vorlage ich eine extra hinzugefügt if-Anweisung innerhalb der get_flashed_messages() wenn:

{% 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

Die anderen Antworten Hier konzentrieren Sie sich auf das Ändern Ihrer Vorlage, damit alle Flash-Nachrichten als sicher markiert werden können, was möglicherweise nicht Ihren Vorstellungen entspricht.

Wenn Sie bestimmte Flash-Nachrichten nur als sicher markieren möchten, übergeben Sie den Text, der in Markup() an flash() übergeben wurde. (Flask API Docs for Markup)

Zum Beispiel statt:

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

Wickeln Sie die Zeichenfolge in Markup() wie folgt aus:

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

Wie immer, müssen Sie Markup aus dem Kolben-Paket importieren etwas wie:

from flask import Markup 
+0

Vielen Dank für Ihre Antwort, aber es ist nichts falsch mit Flasch und Jinja verwenden, aber irgendwo falsch mit Flask-Openid-Plugin. – kxxoling

+0

Dies ist die beste Antwort. – nathancahill

Verwandte Themen