未在Flask会话中使用Flask-Session扩展名设置秘密密钥


79

现在,我正在使用烧瓶第3方库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 __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.

异常的完整回溯是什么?
马丁·彼得斯

Flask-Session您使用的是哪个版本?在当前项目源中找不到该异常的任何引用。
的Martijn Pieters的

@MartijnPieters知道我怎么知道吗?我刚刚为此安装了一个pip
MintyAnt 2014年

已经找到异常消息;它在Flask本身中,而不是Flask-Session中。
马丁·彼得斯

@MartijnPieters我添加了完整的追溯。当我尝试设置“用户id”键,你可以看到它出现
MintyAnt

Answers:


93

在您的情况下,NullSessionInterface会话实现会引发异常,这是使用Flask-Session时的默认会话类型。这是因为您从未真正将SESSION_TYPE配置提供给Flask;仅在模块中将其设置为全局变量不够的。所述瓶会话快速启动的示例代码并设置一个全局,但随后通过调用使用当前模块作为配置对象app.config.from_object(__name__)

对于Flask 0.10或更高版本,此默认设置没有太大意义;NullSessionFlask 0.8或0.9可能是有意义的,但是在当前版本中,flask.session.NullSession该类用作错误信号。就您而言,它现在给您错误的错误消息。

SESSION_TYPE配置选项设置为其他内容。挑一个redismemcachedfilesystemmongodb,并确保其设置在app.config(直接或通过各种Config.from_*方法)。

为了进行快速测试,将其设置filesystem为最简单。那里有足够的默认配置,无需额外的依赖即可正常工作:

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

    sess.init_app(app)

    app.debug = True
    app.run()

如果看到此错误并且您没有使用Flask-Session,则说明设置密码时出了点问题。如果您正在设置app.config['SECRET_KEY']app.secret_key处于上述if __name__ == "__main__":防护状态,则出现此错误,则可能是通过WSGI服务器(将Flask项目作为模块导入)运行Flask应用,并且__name__ == "__main__"块永远不会运行。

无论如何,总是最好在单独的文件中管理Flask应用程序的配置


3
请注意,使用app.secret_key是不好的做法。最好通过app.config对象设置密钥,这使您可以将配置卸载到外部文件。
Miguel 2014年

4
给在这里结束的Heroku用户的注意事项:在app.secret_key = ...移出if块之前,我没有在这里使用示例–从事后看来,这是有意义的,因为Heroku通过gunicorn运行该应用程序,这意味着if __name__ == "__main__":永远不会进入该块。
Pascal 2015年

“将密钥设置为if name ==' main ':'之外的答案,此处stackoverflow.com/users/2900124/hayden的答案是更好的答案(在托管服务器上工作,而在托管服务器上没有)
ng10

@ ng10:当您不使用Flask-Session时,该答案适用。这里的问题是,使用Flask-Session时看到的错误消息没有帮助,而且是错误的。如果您在使用Flask-Session时看到错误消息,则可能适用其他答案。我已经更新了答案以解决这两个选项。
马丁·彼得斯

1
@iamai:记录了Flask-Session配置部分;对于mongodb,默认数据库名称为flask_session,默认集合称为sessions
马丁·彼得斯

58

将密钥设置在 if __name__ == '__main__':

app.py:

from flask import Flask, session

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

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

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

当您通过运行块启动应用程序时,flask runif __name__ == '__main__':被跳过。如果您不想跳过它,请运行python app.py


我正在amazon ec2 apache2 Ubuntu服务器上运行Flask应用程序,使用oauth2.0访问Google日历信息。这个答案是使它起作用的简单修改。谢谢!
2016年

这是对另一个问题的答案,该问题的会话类型已正确配置,或者您根本没有使用Flask-Session,但未设置秘密,因为WSGI服务器已使用import加载了模​​块,而不是主脚本。
马丁·彼得斯

14

试试这个:

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

并删除app.secret_key底部的作业。


我试了一下,没有运气,同样的错误。如果你愿意,我可以更新帖子码
MintyAnt
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.