如何解决错误KeyError:'使用CSRF需要密钥.' 在烧瓶应用中使用wtform时?

ver*_*s78 16 python csrf flask-wtforms firebase-realtime-database

我一直在尝试使用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)
Run Code Online (Sandbox Code Playgroud)

Ahm*_*mzi 17

您收到此错误是因为您尚未设置密钥.如果没有密钥,您就无法使用许多功能,例如闪存,烧瓶登录,当然,正如您所经历的那样,CSRF保护.

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

import os
SECRET_KEY = os.urandom(32)
app.config['SECRET_KEY'] = SECRET_KEY
Run Code Online (Sandbox Code Playgroud)

  • 不知道`os.urandom(32)`。谢谢! (2认同)

小智 6

你需要在应用程序配置中添加一个SECRET_KEY利用CSRF保护,并提供了WRF CSRF SECRET_KEY否则你的密钥将被用来代替

app.config.update(dict(
    SECRET_KEY="powerful secretkey",
    WTF_CSRF_SECRET_KEY="a csrf secret key"
))
Run Code Online (Sandbox Code Playgroud)


小智 6

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

app.config['SECRET_KEY'] = 'any secret string'
Run Code Online (Sandbox Code Playgroud)

  • 就我而言(“Python 3.8.1”、“ArchLinux”、“flask 1.1.1”、调试模式),我必须在“app = Flask(__name__)”之后添加命令才能使其正常工作。出现此错误的示例应用程序如下:https://pastebin.com/fPeE9J2G(我将 cmd 插入到第 32 行)。如果我把它移到第 8 行,一切都会正常。 (2认同)