Используя Flask и WTForms, как следует ссылаться на переменную сервера для изменения при отправке формы с помощью POST?

#flask #flask-wtforms #wtforms

#flask #flask-wtforms #wtforms

Вопрос:

Если бы кто-то хотел работать с «next_object», что нужно было бы сделать с приведенным ниже кодом, чтобы разрешить передачу объектов или идентификатора объекта обратно в «send_and_receive():» с помощью метода post?

Ради людей, которые хотят немедленно закрыть это как дубликат ссылки небезопасным способом, я прошу сделать это с помощью POST, а не GET.

маршруты.py-код

 @app.route('/statistics', methods=['POST'])
def send_and_receive():
    reference_form = ReferenceForm()
    if reference_form.object_approved.data:
        library.approve_object(??reference_object_id_or_object??)
        return redirect('index')
    if reference_form.object_rejected.data:
        library.reject_object(??reference_object_id_or_object??)
        return redirect('index')
    next_object = library.get_next()
    return render_template('site.html', reference_form=reference_form, next_object=next_object)
  

site.html

 {% extends "base.html" %}

{% block content %}
<form  action="" method="post">
  <p>{{next_object.string()}}</p>
  <p>{{ reference_form.object_approved() }}</p>
  <p>{{ reference_form.object_rejected() }}</p>
</form>

{% endblock %}
  

Forms.py код

 class ReferenceForm(FlaskForm):
    object_approved = SubmitField("Approve")
    object_rejected = SubmitField("Reject")
  

Комментарии:

1. Добавьте идентификатор в качестве скрытого поля в ReferenceForm класс.

2. При возврате в скрытом поле не сохраняются данные, как и в любом другом поле.

3. Вы установили SECRET_KEY и включили csrf_token скрытое поле приложения? Смотрите простой пример ответа.

Ответ №1:

Убедитесь, что вы установили SECRET_KEY приложения и отобразили скрытые поля в шаблоне html, включая автоматически добавляемое (см. Документацию) csrf_token скрытое поле.

Простой пример:

app.py

 from flask import Flask, render_template, flash
from flask_wtf import FlaskForm
from wtforms import SubmitField, HiddenField


class ReferenceForm(FlaskForm):
    object_id = HiddenField()
    object_approved = SubmitField("Approve")
    object_rejected = SubmitField("Reject")


app = Flask(__name__)
app.config['SECRET_KEY'] = '123456790'


@app.route('/', methods=['GET', 'POST'])
def index():
    _form = ReferenceForm()
    _form.object_id.data = 42

    if _form.validate_on_submit():

        flash('Object ID:{}'.format(_form.object_id.data))
        print(_form.object_approved.data)
        print(_form.object_rejected.data)
        print(_form.object_id.data)
        # process form blah blah
        # would be usual to return a redirect here     

    return render_template('index.html', reference_form=_form)


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

index.html

 <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% with messages = get_flashed_messages() %}
  {% if messages %}
    <ul class=flashes>
    {% for message in messages %}
      <li>{{ message }}</li>
    {% endfor %}
    </ul>
  {% endif %}
{% endwith %}

<form action="" method="post">
    {{ reference_form.object_id() }}
    {{ reference_form.csrf_token() }}

    <p>{{ reference_form.object_approved() }}</p>
    <p>{{ reference_form.object_rejected() }}</p>
</form>


</body>
</html>
  

Обратите внимание, как отображается HTML, особенно два скрытых поля, object_id и csrf_token :

 <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

  


<form action="" method="post">
    <input id="object_id" name="object_id" type="hidden" value="42">
    <input id="csrf_token" name="csrf_token" type="hidden" value="IjBjNGIwNWE2NDA5NDVmZjhiMjU3Y2E5YTIwY2QwMGVlMTMxYzViYzUi.X0oupA.g9KjI79vZvfEIW1mwzR7nvHc6Yc">

    <p><input id="object_approved" name="object_approved" type="submit" value="Approve"></p>
    <p><input id="object_rejected" name="object_rejected" type="submit" value="Reject"></p>
</form>


</body>
</html>
  

Комментарии:

1. Спасибо, я не понимал, что мне придется обслуживать скрытое поле, и я думаю, я просто проверяю его, когда оно возвращается как ввод.