web-dev-qa-db-ja.com

秘密鍵が設定されていないため、セッションを利用できません。アプリケーションのsecret_keyを一意で秘密の何かに設定します。フラスコ/ Heroku

flaskアプリはローカルホストにログインしてすべて正常に登録できます。しかし、これをherokuにプッシュすると問題になります。上記のエラーが表示されます。これが、app.pyコードです。

from flask import Flask, render_template, request, redirect, jsonify, url_for, flash
from sqlalchemy import create_engine, asc, desc
from sqlalchemy.orm import sessionmaker
from database_setup import Base, User, BlogPost
from flask import session as login_session
import random
import string
from wtforms import Form, BooleanField, TextField, PasswordField, validators
from passlib.hash import sha256_crypt


app = Flask(__name__)


#Connecting to database
engine = create_engine('sqlite:///travellerdata.db')
Base.metadata.bind = engine

DBSession = sessionmaker(bind=engine)
session = DBSession()

そして最後に...

if __name__ == "__main__":
    app.secret_key = 'some secret key'
    app.debug = True
    app.run()
8
Flyn Sequeira

HTTPサーバーがアプリケーションをロードしているときに、__name__'main'と等しくない可能性があります。行app.secret_key = 'some secret key'をifブロックの外に移動してみてください。

秘密鍵をソースコードに入れるのは良い考えではありません。誰かが秘密鍵を入手すると、悪意を持ってシステムにアクセスする可能性があるからです。アプリケーションのインスタンスディレクトリ( スニペットはこちら )のファイルに保存するか、環境変数( 説明はこちら )に入れてみてください。

8
joshreesjones

フラスコログインを使用してセッションIDを生成する場合も同じ問題が発生します。直接実行すると正常に機能しますが、HTTPサーバーを使用するとエラーが出力されます。元のコードは次のようなものです。

_if __name__ == "__main__":
    app.secret_key = os.urandom(24)
    app.run()
_

次に、app.secret_key = os.urandom(24)を___name___から移動し、次のようにapp = Flask(__name__)の下に配置しました。

_app = Flask(__name__)
app.secret_key = os.urandom(24)

login_manager = flask_login.LoginManager()
login_manager.init_app(app)
_

そして今は問題なく動作します。

5
Yibei Huang

例外は、Flask-Sessionを使用する場合のデフォルトのセッションタイプであるNullSessionInterfaceセッション実装によって発生します。これは、実際にSESSION_TYPE構成をFlaskに指定したことがないためです。モジュールでグローバルとして設定するだけでは不十分です。

このデフォルトは、Flask 0.10ではあまり意味がありません。Flask 0.8または0.9では意味があるかもしれませんが、現在のバージョンはエラーとして使用されますあなたの場合、それはあなたに今間違ったエラーメッセージを与えます。

SESSION_TYPE構成オプションを別のものに設定します。 redis、memcached、filesystem、またはmongodbのいずれかを選択します。

ファイルシステムに設定するのが最も簡単です。追加の依存関係なしで機能するのに十分なデフォルト構成があります。

if __name__ == "__main__":
    app.secret_key = 'super secret key'
    app.config['SESSION_TYPE'] = 'filesystem'

    sess.init_app(app)

app.debug = True
app.run()
2
Rishit Shah