Flash message istediğim gibi çalışmıyor

Anlamlandıramadığım şekilde flash mesajı vermesini istediğim yerde değilde dashboarda gidince veriyor farklı birkaç yerde aynı kullanımla istediğim yerde vermesine rağmen :slight_smile: message.html, yazdığım fonksiyon Neyden kaynaklanıyor olabilir yardımlarınızı bekliyorum.

Konsolda bir hata çıktısı alıyor musunuz? Dashboard diye bahsettiğiniz kısım neresi? Ayrıca kodlarınızı burada belirtildiği gibi atarsanız daha iyi olur. Bilmiyorum benden kaynaklı mı ama Ubuntu Pastebin Python kodlarını dayanılmayacak kadar kötü gösteriyor.

Konuyu biraz aceleyle açmışım kusura bakmayın. Dashboard konuyla yazdığım fonksiyonla alakası olmayan farklı bir sayfa, kodu en altta. Flash ile sweetalert javascript kütüphanesini kullanarak alert veriyorum. Denemek isterseniz kayıt olduktan sonra kullanıcı adınızı yazarsanız yetki verebilirim : site burda Daha iyi anlamanız için bir video yükledim.
flash mesajı çalışmayan fonksiyon :

@app.route("/setadmin/<string:id>")
@login_required
def setadmin(id):
    cur = mysql.connection.cursor()
    sor = "select * from users where username = %s"
    cur.execute(sor,(session["username"],))
    data = cur.fetchone()
    if data["statu"]=="admin":
        cursor = mysql.connection.cursor()
        setadmin = "UPDATE users SET statu='admin' WHERE id=%s"
        cursor.execute(setadmin,(id,))
        mysql.connection.commit()
        flash("Editor setted.","success")
        return redirect(url_for("useradmin"))
    else:
        return redirect(url_for("mainpage"))

messages.html

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>Deneme</title>
    <style media="screen">
    body {
font-family: "Open Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", Helvetica, Arial, sans-serif;
}
    </style>
  </head>
  <body>
{% with messages = get_flashed_messages(with_categories=true) %}
  {% if messages %}
    <script src="https://cdn.jsdelivr.net/npm/sweetalert2@9"></script>
    <script src="https://cdn.jsdelivr.net/npm/promise-polyfill"></script>
    <script src="sweetalert2.min.js"></script>
    <link rel="stylesheet" href="sweetalert2.min.css">
    <script type="text/javascript">
{% for category, message in messages %}
    Swal.fire({
      icon: '{{category}}',
      title: '{{message}}',
      footer: '<a href>Show it!</a>'
    })

    </script>
 {% endfor %}

      {% endif %}
    {% endwith %}

  </body>
</html>

Burdaki flash mesajı istediğim gibi gözüküyor. Başta flash mesajından sonra başka bir sayfaya yönlendirme yapıyordum ve ancak dashboarda gidince alert geliyordu şimdi direk dashboarda yönlendirdiği için çalışıyor.

@app.route("/addarticle",methods=["GET","POST"])
@login_required
def addarticle():
    cur = mysql.connection.cursor()
    sor = "select * from users where username = %s"
    cur.execute(sor,(session["username"],))
    data = cur.fetchone()
    if data["statu"]=="editor" or data["statu"]=="admin":
        if request.method=="POST":
            title=request.form.get("answer_a")
            content=request.form.get("answer_c")
            visible=request.form.get("answer_b")
            username=session["username"]

            cursor = mysql.connection.cursor()
            sorgu = "INSERT INTO articles (title,author,content,visible) VALUES (%s,%s,%s,%s)"
            cursor.execute(sorgu,(title,username,content,visible,))
            mysql.connection.commit()
            cursor.close()
            flash("Your article has been added","success")
            return redirect(url_for("dashboard"))

        else:
            return render_template("add-article.html")

    else:
        flash("You are not authorized to do this","warning")
        return redirect(url_for("mainpage"))
@app.route("/dashboard")
@login_required
def dashboard():
    cur = mysql.connection.cursor()
    sor = "select * from users where username = %s"
    cur.execute(sor,(session["username"],))
    data = cur.fetchone()
    if data["statu"]=="editor" or data["statu"]=="admin":
        cursor = mysql.connection.cursor()
        sorgu = "Select * from articles where author = %s"
        result = cursor.execute(sorgu,(session["username"],))

        if result > 0:
            articles = cursor.fetchall()
            return render_template("dashboard.html",articles = articles)
        else:
            return render_template("dashboard.html")
    else:
        return redirect(url_for("mainpage"))

Loglarda hata çıktısı yok son olarak :slight_smile:

Flash mesajı gönderdikten sonra urlde bir değişme olmuyor. Farklı bir urlye gidince flash mesajınız çalıştırılıyor anladığım kadarıyla. Siz butona tıklandıktan hemen sonra göstermek istiyorsunuz doğru mu anlıyorum?

Evet bu şekilde. Ancak yalnız dahsboard a gidince çalışıyor diğer urllerde değil.

Messages.html i nasıl kullanıyorsunuz anlayamadım. Sanırım kodun o kısmını atmadınız. Dashboard’la bir bağlantısı var sanırım. Ama problemi flash mesaj yerine javascript ile çözmek daha kolay olacak bence. render_template("foo.html",alert="Uyarı") şeklinde gönderme yapsanız. Ardından da foo.html in içinden javascript ile kontrol ederseniz hallolur diye düşünüyorum. Tam olarak anlatamadıysam tekrar yazarsanız örnek birşeyler yapmaya çalışayım. Javascript bilgim çok fazla değil sizinkinin daha iyi olduğunu düşündüğüm için anlattım. (foo.html örenk dosya adı)

1 Beğeni

messages.html nin dashboardla bir alakası yok(en azından öyle düşünüyorum) Klasik flash messaging template’i ile javascript kütüphanesini birleştirdim. Dediğiniz gibi uyarıyı render template ile gönderip istediğim sayfada göstermeyi deneyeceğim teşekkürler :slight_smile: Ancak flash ile ilgili fikri olan arkadaşlar yazabilirler.

Kendi kullandığım flash fonksiyonu: includes/messages.html

{% with messages = get_flashed_messages(with_categories=true) %}
  {% if messages %}
    
    {% for category, message in messages %}
    <div class="alert alert-{{category}}" role="alert">
    {{ message }}
    </div>
    {% endfor %}
    
  {% endif %}
{% endwith %}

Kullanacağım sayfanın içinden {% include "includes/messages.html" %} şeklinde çalıştırıyorum. Boostrap alert class’ı kullanıyor.

Evet bende aynı şekilde kullanıyorum. Redirect işlemiyle ilgili olabileceğini düşünüyorum. Benzer bir sorun buradada yaşanmış ama nasıl çözüldüğünü anlayamadım doğrusu (: