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

Posted

技术标签:

【中文标题】如何解决错误 KeyError: \'A secret key is required to use CSRF.\'在烧瓶应用程序中使用 wtform 时?【英文标题】:How do you solve the error KeyError: 'A secret key is required to use CSRF.' when using a wtform in flask application?如何解决错误 KeyError: 'A secret key is required to use CSRF.'在烧瓶应用程序中使用 wtform 时? 【发布时间】:2018-05-21 02:27:54 【问题描述】:

我一直在尝试使用烧瓶和 wtforms 以及 firebase 数据库构建 Web 应用程序,但我不断收到错误消息“KeyError: 'A secret key is required to use 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)

【问题讨论】:

看这个:***.com/questions/21501058/… 【参考方案1】:

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

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

【讨论】:

app = Flask(name) app.config.update(dict( SECRET_KEY="powerful secretkey", WTF_CSRF_SECRET_KEY="a csrf secret key" )) app.config[ 'SQLALCHEMY_DATABASE_URI'] = 'sqlite:///somedbfile.db' db = SQLAlchemy(app) csrf = CSRFProtect(app) csrf.init_app(app) 我仍然收到 RuntimeError: A secret key is required to use CSRF。尝试打开路径时出错。 我错过了什么?请问,你能告诉我吗?【参考方案2】:

将此行添加到您的app 代码中:

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

【讨论】:

就我而言(Python 3.8.1ArchLinuxflask 1.1.1、调试模式)我必须在 app = Flask(__name__) 之后添加命令才能使其正常工作。存在此错误的示例应用程序:pastebin.com/fPeE9J2G(我将 cmd 插入第 32 行)。如果我将它移到第 8 行,一切正常。【参考方案3】:

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

解决此问题的最简单方法是在您的应用配置文件中设置密钥,但与其他答案显示的不同,强烈建议您保存所有密钥(尤其是某些付费 API 或服务的密钥)例如 AWS)在单独的 .env 文件中,该文件在分发代码时不共享。幸运的是,对于密钥,您不必担心环境变量,您可以创建一个随机密钥,如下所示:

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

【讨论】:

不知道os.urandom(32)。谢谢! 如果文件已加密,您可以共享该文件。在必要的烧瓶初始化期间解密它。

以上是关于如何解决错误 KeyError: 'A secret key is required to use CSRF.'在烧瓶应用程序中使用 wtform 时?的主要内容,如果未能解决你的问题,请参考以下文章

在 Pandas 中使用 groupby 函数时如何解决“keyerror”?

如何使用 Flask-SocketIO 修复此 KeyError 错误?

python里出现keyerror 怎么解决

在Python中出现了KeyError: ''怎么解决?

KeyError:Caught KeyError in Dataloader worker process 0. KeyError:‘标签’

[深度学习][OCR][原创]CRNN_Chinese_Characters_Rec训练360w数据集提示keyerror错误解决方法