Удаление csrf_token перед вставкой в ​​MongoDB - PullRequest
0 голосов
/ 07 октября 2019

В моем приложении я использую 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 %
...