現在、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.
あなたの場合、例外は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
構成オプションを別のものに設定します。 redis
、memcached
、filesystem
、または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アプリの構成を別のファイルで管理する の方が常に良いです。
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
で実行してください。
これを試して:
app = Flask(__name__)
app.config['SESSION_TYPE'] = 'memcached'
app.config['SECRET_KEY'] = 'super secret key'
sess = Session()
下部のapp.secret_key
割り当てを削除します。