В моем приложении я использую flask_mongoengine
для подключения к MongoDB. Я получаю сообщение об ошибке
Поля "{'csrf_token'}" не существуют в документе "Study"
при вставке документа.
Мне удалось преодолеть ошибку, вручную удалив csrf_token перед сохранением (см. Код ниже). Есть ли более элегантный способ преодолеть эту ошибку? Это было бы особенно полезно для моделей, содержащих EmbeddedDocument
, поскольку все внедренные документы имеют csrf_token.
app.py
from flask import Flask, render_template, request
from flask_bootstrap import Bootstrap
from flask_mongoengine import MongoEngine
from flask_wtf.csrf import CSRFProtect
from flask_mongoengine.wtf import model_form
from wtforms.meta import DefaultMeta
db = MongoEngine()
bootstrap = Bootstrap()
csrf = CSRFProtect()
app = Flask(__name__)
app.secret_key = 'My secret key'
app.config['MONGODB_HOST'] = 'host'
app.config['MONGODB_PORT'] = 27017
app.config['MONGODB_DB'] = 'database'
app.config['MONGODB_USERNAME'] = 'user'
app.config['MONGODB_PASSWORD'] = 'user'
db.init_app(app)
bootstrap.init_app(app)
csrf.init_app(app)
class Study(db.Document):
name = db.StringField()
@app.route('/', methods=['GET', 'POST'])
def hello_world():
StudyForm = model_form(Study, field_args={})
study_form = StudyForm()
if request.method == 'POST':
study_form = StudyForm(request.form)
if study_form.validate():
del study_form._fields['csrf_token']
study_form.save()
return "Success"
return render_template('index.html', form=study_form)
if __name__ == '__main__':
app.run(debug=True,host='0.0.0.0')
index.html
{% extends "bootstrap/base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% block content %}
<div class="container">
<form action="" method="POST">
{{ form.hidden_tag() }}
{{ form.name.label() }}
{{ form.name() }}
<input type=submit class='btn btn-primary '>
</form>
</div>
{% endblock %