web-dev-qa-db-ja.com

エラーKeyErrorをどのように解決しますか:「CSRFを使用するには秘密鍵が必要です。」 flask application?

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)
13
versailles78

秘密鍵を設定していないため、このエラーが発生しています。秘密鍵がないと、フラッシュ、フラスコログイン、そしてもちろんあなたが経験したようにCSRF保護などの多くの機能を使用できません。

これを解決する最も簡単な方法は、アプリの構成ファイルに秘密キーを設定することですが、他の回答が示しているものとは異なり、すべてのキー(特にAWSなどの一部の有料APIまたはサービスのキー)を保存することを強くお勧めします)別の.envコードの配布時に共有されないファイル。幸いなことに、秘密鍵については、環境変数を心配する必要はなく、次のようにランダムな秘密鍵を作成するだけです。

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

アプリケーション構成にSECRET_KEYを追加してcsrf保護を利用し、WRF CSRF SECRET_KEYを提供する必要があります。そうしないと、代わりに秘密鍵が使用されます

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

appコードに次の行を追加します。

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