Как передать аргументы для перенаправления возврата (url ()) в flask - PullRequest
0 голосов
/ 05 апреля 2020

Я пытаюсь обновить профиль в flask. Все работает нормально, но однажды его отредактированное сообщение не отображается на странице html, когда я даю {{msg11}}. Я не понимаю, как передать аргументы, чтобы сообщение отображалось на странице html. Я попробовал этот подход, но он не отображается на html странице

@app.route("/updateProfile", methods=["GET", "POST"])
def updateProfile():
    if request.method == 'POST':
        email = request.form['email']
        firstName = request.form['firstName']
        lastName = request.form['lastName']
        with sqlite3.connect('database.db') as con:
                try:
                    cur = con.cursor()
                    cur.execute('UPDATE users SET firstName = ?, lastName = ? WHERE email = ?', (firstName, lastName))
                    con.commit()
                    msg11 = "Saved Successfully"
                except:
                    con.rollback()
                    msg11 = "Error occured"
        con.close()
        return redirect(url_for('editProfile', msg11=msg11))

Добавление функции editprofile. В этой функции я удалил sql запросов

def editProfile():
    if 'email' not in session:
        return redirect(url_for('root'))
    loggedIn, firstName, noOfItems = getLoginDetails()

        profileData = cur.fetchone()
    conn.close()
    return render_template("editProfile.html", profileData=profileData, loggedIn=loggedIn, firstName=firstName, noOfItems=noOfItems)

1 Ответ

0 голосов
/ 05 апреля 2020

Когда вы предоставляете ключевые аргументы для функции url_for, Flask автоматически кодирует ваши значения в компоненты URI и добавляет их в URL вашего запроса.

Используя ваш код в качестве примера, выполните это

msg11='Saved Successfully'
return redirect(url_for('editProfile', msg11=msg11))

Будет выдан этот URL при передаче по маршруту editProfile

/editProfile?msg11=Saved+Successfully

. Вы можете легко извлечь это значение, используя встроенный в Flask объект request

from flask import request
# Inside of editProfile() route
msg11 = request.args.get('msg11', None)

Таким образом, вы можете просто проверить, существует ли это значение (вызов get() совпадает с обычным соглашением Python, где будет возвращено значение None, если значение не найдено), и передайте его вашему шаблону HTML.

Кроме того, используя функциональность Jinja, вы можете отображать сообщение, только если оно не является значением None, используя что-то вроде этого

{% if msg11 is not none %}
<h1>{{ msg11 }}</h1>
{% endif %}

Полный минимальный пример приведен ниже:

app.py

from flask import Flask, render_template, redirect, url_for, request

app = Flask(__name__)

@app.route("/updateProfile", methods=["GET", "POST"])
def updateProfile():
    msg11 = "Saved Successfully"
    return redirect(url_for("editProfile", msg11=msg11))

@app.route("/editProfile")
def editProfile():
    msg11 = request.args.get("msg11")
    return render_template("editProfile.html", msg11=msg11)

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

templates/editProfile.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>editProfile</title>
</head>
<body>
    {% if msg11 is not none %}
    <h1>{{ msg11 }}</h1>
    {% else %}
    <h1>msg11 has a value of None</h1>
    {% endif %}
</body>
</html>
...