web-dev-qa-db-ja.com

Flask-Session拡張機能を使用して、flaskセッションで設定されていない秘密鍵

現在、flaskサードパーティライブラリ Flask-Session を使用していますが、セッションを正常に動作させることができません。

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

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 __== "__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.
65
MintyAnt

あなたの場合、例外は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 class がエラー信号として使用されます。あなたの場合、それは今あなたに間違ったエラーメッセージを与えます。

SESSION_TYPE構成オプションを別のものに設定します。 redismemcachedfilesystem、またはmongodbのいずれかを選択し、app.config(直接または さまざまなConfig.from_*メソッド )。

簡単なテストを行うには、filesystemに設定するのが最も簡単です。依存関係を追加せずに動作させるのに十分なデフォルト構成があります。

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

    sess.init_app(app)

    app.debug = True
    app.run()

このエラーが表示され、Flask-Sessionを使用しているnotの場合、シークレットの設定に問題があります。上記のapp.config['SECRET_KEY']ガードでapp.secret_keyまたはif __== "__main__":を設定しているときにこのエラーが発生した場合、おそらくFlaskアプリをWSGIサーバー経由で実行しています。 Flaskプロジェクトをモジュールとしてインポートし__== "__main__"ブロックは実行されません。

とにかく、 Flaskアプリの構成を別のファイルで管理する の方が常に良いです。

69
Martijn Pieters

if __== '__main__':の外側に秘密鍵を設定します

app.py:

from flask import Flask, session

app = Flask(__name__)
app.secret_key = "super secret key"

@app.route("/")
...

if __== '__main__':
    app.debug = True
    app.run()

flask runを実行してアプリを起動すると、if __== '__main__':ブロックはスキップされます。スキップしたくない場合は、python app.pyで実行してください。

48
hayden

これを試して:

app = Flask(__name__)
app.config['SESSION_TYPE'] = 'memcached'
app.config['SECRET_KEY'] = 'super secret key'
sess = Session()

下部のapp.secret_key割り当てを削除します。

10
Miguel