如何解决 KeyError: 'A Secret key is required to use CSRF.' 错误在 Flask 应用程序中使用 wtform 时?

问题描述 投票:0回答:5

我一直在尝试使用 Flask 和 wtforms 以及 firebase 数据库构建一个 Web 应用程序,但我不断收到错误消息“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)
python firebase-realtime-database csrf flask-wtforms
5个回答
60
投票

您收到此错误是因为您尚未设置密钥。如果没有密钥,您将无法使用许多功能,例如 flash、flask-login,当然,正如您所经历的,CSRF 保护。

解决此问题的最简单方法是在应用程序配置文件中设置一个密钥,但与其他答案所示的不同,强烈建议保存所有密钥(尤其是某些付费 API 或服务的密钥,例如AWS)位于单独的

.env
文件中,分发代码时不会共享该文件。幸运的是,对于密钥,您不必担心环境变量,您可以创建一个随机密钥,如下所示:

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

12
投票

您需要在应用程序配置中添加 SECRET_KEY 才能利用 csrf 保护并提供 WRF CSRF SECRET_KEY 否则将使用您的密钥

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

8
投票

将此行添加到您的

app
代码中:

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

0
投票

我通过在

SECRET_KEY = 'mysecret'
 中添加 
config.py

解决了该问题

文件,然后确保在我像这样调用

create_app()
时添加配置

env = os.environ.get('FLASK_ENV', 'dev')

app = create_app('app.config.%sConfig' % env.capitalize())

0
投票

您需要像这样添加密钥:

from flask import Flask, session

app = Flask(__name__)
app.secret_key = secret_key  # Set the secret key for the Flask application

@app.route('/')
def index():
    # Your view logic here
    pass
© www.soinside.com 2019 - 2024. All rights reserved.