如何解决错误 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.1
、ArchLinux
、flask 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 错误?
KeyError:Caught KeyError in Dataloader worker process 0. KeyError:‘标签’
[深度学习][OCR][原创]CRNN_Chinese_Characters_Rec训练360w数据集提示keyerror错误解决方法