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)
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
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"
))
Ajoutez cette ligne à votre code app
:
app.config['SECRET_KEY'] = 'any secret string'