2014-09-28 81 views
38

我在运行Flask(一个Python模块)中得到0会话。未在烧瓶会话中设置的密钥

现在我用的烧瓶第三方库Flask-Session

当我连接到我的网站,我收到以下错误:

RuntimeError: the session is unavailable because no secret key was set. Set the secret_key on the application to something unique and secret.

下面是我的服务器代码。

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. 
+0

异常的*完整回溯*是什么? – 2014-09-28 01:58:56

+0

你使用什么版本的Flask-Session?我在[当前项目源代码](https://github.com/fengsp/flask-session)中找不到该异常的任何引用。 – 2014-09-28 02:00:09

+0

@MartijnPieters任何想法如何我可以弄清楚?我只是做了一个点子安装 – MintyAnt 2014-09-28 02:03:33

回答

41

唯一的例外是由NullSessionInterface会话实现,这是默认会话类型当您使用瓶上调-session。这是因为你实际上没有给配置SESSION_TYPE Flask;这是不够将其设置为您的模块中的全局。

这个默认值对Flask 0.10没有多大意义;它可能对Flask 0.8或0.9有意义,但当前版本被用作错误信号。在你的情况下,它现在给你错误的错误信息。

SESSION_TYPE配置选项设置为其他值。选择redis,memcached,filesystemmongodb之一。

将其设置为filesystem是最简单的;有足够的默认配置那里有没有额外的依赖项工作:

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

    sess.init_app(app) 

    app.debug = True 
    app.run() 
+1

当我重命名SESSION_TYPE时,我仍然没有多少运气......也许这个库已经过时了?你是否推荐了一个不同的瓶子会话方法?我可以尝试一些烧瓶网站上列出的片段,但我也在那里一头扎进了一堵砖墙。我可以为这些人发布一个单独的问题。 – MintyAnt 2014-09-28 02:12:48

+0

@MintyAnt:不确定您的意思*重命名SESSION_TYPE *;我为你添加了一个示例配置。 – 2014-09-28 02:21:21

+1

@MintyAnt:啊,你把它定义为一个全球性的,这还不够。您需要将其设置为'app'上的配置。 – 2014-09-28 02:24:45

6

试试这个:

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

,并在底部删除您app.secret_key分配。

+0

我给了这个镜头,没有运气,同样的错误。我可以更新帖子代码,如果你愿意 – MintyAnt 2014-09-28 02:17:38

28

设置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 run来运行你的应用,而python app.py__name__ != '__main__'

+0

我正在amazon ec2 apache2 Ubuntu服务器上运行烧瓶应用程序,使用oauth2.0访问谷歌日历信息。这个答案是使它工作的简单修改。谢谢! – jas 2016-02-16 05:17:00

+0

谢谢!这解决了我的问题,而接受的答案没有 – rlsw 2017-07-21 12:29:32

+0

为什么这解决了这个问题?这似乎很奇怪... – Garrett 2017-12-17 05:35:40