перенаправление (url_for()) передача параметров не работает

#python #flask

#python #flask

Вопрос:

когда я передаю параметр, используя redirect и url_for, он добавляет их в URL, но не показывает их в html. Если я использую render_template и передаю параметры, он работает так, как должен.

Мой код:

 @app.route("/forgotpass", methods = ["GET", "POST"])
def forgot_password():
    if session["logged_in"] == True:
        return redirect(url_for("profile"))
    
    if request.method == "POST":
        email = request.form["username"]
        email = email.lower()

        logins.forgotPassword(email)

        return redirect(url_for("login", error = "We have sent you an email with your new password!"))
    
    elif request.method == "GET":
        return render_template("forgotPassword.html")
 

HTML:

 <p>{{ error | default('') }}</p>
 

Кто-нибудь знает, как я могу это исправить?

Ответ №1:

Вот как url_for это работает, вы можете передать ему параметры / переменные, и они будут добавлены к URL, он не предназначен для отображения ошибок.

Если вы хотите отображать сообщения пользователю, например, после успешного входа в систему или при сбое входа в систему, вместо этого следует использовать мигание сообщений: https://flask.palletsprojects.com/en/1.1.x/patterns/flashing /

Пример кода, сначала импортируйте flash из flask:

 @app.route("/forgotpass", methods = ["GET", "POST"])
def forgot_password():
    if session["logged_in"] == True:
        return redirect(url_for("profile"))
    
    if request.method == "POST":
        email = request.form["username"]
        email = email.lower()

        logins.forgotPassword(email)

        flash('We have sent you an email with your new password!')

        return redirect(url_for("login"))
    
    elif request.method == "GET":
        return render_template("forgotPassword.html")
 

Поместите это где-нибудь в свой шаблон входа:

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