web-dev-qa-db-fra.com

Comment résoudre l'erreur KeyError: "Une clé secrète est requise pour utiliser CSRF." lors de l'utilisation d'une application wtform in flask?

J'ai essayé de créer une application Web en utilisant flask, wtforms et une base de données Firebase, mais le message d'erreur "KeyError:" Une clé secrète est nécessaire pour utiliser CSRF. " . voici mon code:

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 __== '__main__':
    app.run(debug=True)
6
versailles78

Vous obtenez cette erreur parce que vous n'avez pas configuré de clé secrète. Sans clé secrète, vous ne pouvez pas utiliser de nombreuses fonctionnalités telles que le flash, la connexion au flacon et, bien entendu, la protection CSRF.

Le moyen le plus simple de résoudre ce problème consiste à définir une clé secrète dans le fichier de configuration de votre application. Toutefois, contrairement à ce que les autres réponses ont montré, il est vivement recommandé de sauvegarder toutes vos clés (en particulier les clés de certaines API ou services payants, tels que AWS). ) dans un fichier .env séparé qui n'est pas partagé lorsque le code est distribué. Heureusement, pour la clé secrète, vous n'avez pas à vous soucier des variables d'environnement et vous pouvez simplement créer une clé secrète aléatoire comme suit:

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

vous devez ajouter un SECRET_KEY dans la configuration de l'application pour pouvoir bénéficier de la protection csrf et fournir un WRF CSRF SECRET_KEY, sinon votre clé secrète sera utilisée à la place.

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

Ajoutez cette ligne à votre code app:

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