1. ホーム
  2. python

[解決済み] Flask-Session エクステンションを使ったセッションで、秘密鍵が設定されていない。

2022-12-17 17:29:17

質問

現在、私はflaskのサードパーティライブラリである Flask-セッション を使用していますが、セッションを動作させるのに苦労しています。

自分のサイトに接続すると、以下のエラーが表示されます。

RuntimeError: 秘密鍵が設定されていないため、セッションは使用できません。 が設定されていないため、セッションは利用できません。アプリケーションのsecret_keyにユニークで秘密のものを設定してください。 秘密にしてください。

以下は私のサーバーコードです。

from flask import Flask, session
from flask.ext.session import Session

SESSION_TYPE = 'memcache'
    
app = Flask(__name__)
sess = Session()

nextId = 0

def verifySessionId():
    global nextId

    if not 'userId' in session:
        session['userId'] = nextId
        nextId += 1
        sessionId = session['userId']
        print ("set userid[" + str(session['userId']) + "]")
    else:
        print ("using already set userid[" + str(session['userId']) + "]")
    sessionId = session.get('userId', None)
    return sessionId

@app.route("/")
def hello():
    userId = verifySessionId()
    print("User id[" + str(userId) + "]")
    return str(userId)

if __name__ == "__main__":
    app.secret_key = 'super secret key'

    sess.init_app(app)

    app.debug = True
    app.run()

ご覧の通り、アプリの秘密鍵は設定しています。何が間違っているのでしょうか?

他のセッションオプションはありますか?

他の情報です。 Linux MintでPython 2.7を動かしています。

フルペーストです。

Traceback (most recent call last):
  File "/home/sean/code/misc/hangman/venv/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__
    return self.wsgi_app(environ, start_response)
  File "/home/sean/code/misc/hangman/venv/lib/python2.7/site-packages/flask/app.py", line 1820, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "/home/sean/code/misc/hangman/venv/lib/python2.7/site-packages/flask/app.py", line 1403, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/home/sean/code/misc/hangman/venv/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/sean/code/misc/hangman/venv/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/sean/code/misc/hangman/venv/lib/python2.7/site-packages/flask/app.py", line 1381, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/sean/code/misc/hangman/venv/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/sean/code/misc/hangman/venv/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/sean/code/misc/session/sessiontest.py", line 27, in hello
    userId = verifySessionId()
  File "/home/sean/code/misc/session/sessiontest.py", line 16, in verifySessionId
    session['userId'] = nextId
  File "/home/sean/code/misc/hangman/venv/lib/python2.7/site-packages/werkzeug/local.py", line 341, in __setitem__
    self._get_current_object()[key] = value
  File "/home/sean/code/misc/hangman/venv/lib/python2.7/site-packages/flask/sessions.py", line 126, in _fail
    raise RuntimeError('the session is unavailable because no secret '
RuntimeError: the session is unavailable because no secret key was set.  Set the secret_key on the application to something unique and secret.

どのように解決するのですか?

あなたの場合、例外が発生するのは NullSessionInterface セッションの実装である デフォルトのセッションタイプ を実装したもので、Flask-Session を使用した場合のデフォルトのセッションタイプです。というのも、実際に SESSION_TYPE コンフィギュレーション をFlaskに渡すことはないからです。 です。 足りない では不十分です。その Flask-Session クイックスタートのサンプルコード はグローバルを設定しますが、その後に app.config.from_object(__name__) .

このデフォルトは、Flask 0.10 以降ではあまり意味を持ちません。 NullSession は、Flask 0.8 や 0.9 では意味があったかもしれませんが、現在のバージョンでは flask.session.NullSession クラス はエラーシグナルとして使用されます。あなたの場合、今は間違ったエラーメッセージが表示されています。

を設定します。 SESSION_TYPE の設定オプションを何か他のものに変更してください。のいずれかを選んでください。 redis , memcached , filesystem または mongodb で設定し、必ず app.config に設定します (直接、または で設定します。 Config.from_* メソッド ).

簡単なテストのために、これを filesystem に設定するのが最も簡単です。追加の依存関係なしに動作させるのに十分なデフォルトの設定がそこにあります。

if __name__ == "__main__":
    # Quick test configuration. Please use proper Flask configuration options
    # in production settings, and use a separate file or environment variables
    # to manage the secret key!
    app.secret_key = 'super secret key'
    app.config['SESSION_TYPE'] = 'filesystem'

    sess.init_app(app)

    app.debug = True
    app.run()

このエラーが表示された場合、あなたは ではなく を使用している場合、secret の設定に何か問題があります。もしあなたが app.config['SECRET_KEY'] または app.secret_key の中に if __name__ == "__main__": のようなガードで、このエラーが発生した場合、おそらくFlaskプロジェクトをインポートしたWSGIサーバーを介してFlaskアプリを実行しているのでしょう。 をモジュールとしてインポートしている をインポートしているWSGIサーバーで、かつ __name__ == "__main__" ブロックは決して実行されません。

常に はFlaskアプリの設定を別ファイルで管理するのがよいでしょう。 を使用したほうがよいでしょう。