Как вы решаете ошибку KeyError: "Для использования CSRF требуется секретный ключ". при использовании wtform в колбе?

Я пытаюсь создать веб-приложение с использованием флагов и wtforms и базы данных firebase, но я продолжаю получать сообщение об ошибке "KeyError:" Для использования CSRF требуется секретный ключ ". И я не знаю, как решить его. вот мой код:

from flask import Flask, render_template, request
from firebase import firebase
from flask_wtf import FlaskForm
from flask_wtf.csrf import CSRFProtect, CSRFError
from wtforms import DateField, StringField, TextAreaField
from wtforms.validators import DataRequired
from wtforms_components import TimeField



app = Flask(__name__)

csrf = CSRFProtect(app)


firebase = firebase.FirebaseApplication("https://uhungry-f9563.firebaseio.com", None)

class myForm(FlaskForm):
        event = StringField("event", validators=[DataRequired()])
        location = StringField("location", validators=[DataRequired()])
        startDay = DateField("startDay", validators=[DataRequired()])
        startTime = TimeField("startTime", validators=[DataRequired()])
        endDay = DateField("endDay", validators=[DataRequired()])
        endTime = TimeField("endTime", validators=[DataRequired()])
        details = TextAreaField("details", validators=[DataRequired()])


count = 0

@app.route('/', methods=['GET' , 'POST'])
def home():
    form = myForm()
    if form.validate_on_submit():
        global count
        count += 1
        putData = {'Event': form.event.data, 'Location': form.location.data, 'startDay': form.startDay.data, 'startTime': form.startTime.data,'endDay': form.endDay.data, 'endTime': form.endTime.data, 'Details': form.details.data}
        firebase.put('/events', 'event' + str(count), putData)
        return render_template("trial.html")
    return render_template("home.html")

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

Ответ 1

Вы получаете эту ошибку, потому что вы не настроили секретный ключ. Без секретного ключа вы не сможете использовать многие функции, такие как flash, логин при входе в флеш-память и, конечно, как вы уже видели, защиту от CSRF.

Самый простой способ решить эту проблему - установить секретный ключ в файле конфигурации вашего приложения, но, в отличие от других ответов, настоятельно рекомендуется сохранить все ваши ключи (особенно ключи некоторых платных API или служб, таких как AWS). ) в отдельном файле .env который не .env при распространении кода. К счастью, для секретного ключа вам не нужно беспокоиться о переменных среды, и вы можете просто создать случайный секретный ключ следующим образом:

import os
SECRET_KEY = os.urandom(32)
app.config['SECRET_KEY'] = SECRET_KEY

Ответ 2

вам нужно добавить SECRET_KEY в конфигурацию приложения, чтобы воспользоваться преимуществами защиты csrf и предоставить WRF CSRF SECRET_KEY, иначе вместо этого будет использоваться ваш секретный ключ.

app.config.update(dict(
    SECRET_KEY="powerful secretkey",
    WTF_CSRF_SECRET_KEY="a csrf secret key"
))

Ответ 3

Добавьте эту строку в код вашего app:

app.config['SECRET_KEY'] = 'any secret string'

Ответ 4

Я знаю, что этот поток существует давно, но у меня была та же проблема, однако у меня есть ключ CSRF в моем файле config.py.

Мой файл config.py:

DEBUG = True
app.config['SECRET_KEY'] = '1234567890'

init.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_wtf.csrf import CSRFProtect, CSRFError


app = Flask(__name__)

csrf = CSRFProtect(app)

db = SQLAlchemy(app)

from app.controllers import default

Некоторая идея, как это исправить?