#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. Спасибо, я не понимал, что мне придется обслуживать скрытое поле, и я думаю, я просто проверяю его, когда оно возвращается как ввод.