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

Min*_*Ant 70 python session 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 __name__ == "__main__":
    app.secret_key = 'super secret key'

    sess.init_app(app)

    app.debug = True
    app.run()
Run Code Online (Sandbox Code Playgroud)

如您所见,我确实设置了应用程序密钥.我究竟做错了什么?

还有其他会话选项吗?

其他信息:在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.
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 75

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

对于Flask 0.10或更新版本,此默认值没有多大意义; NullSessionFlask 0.8或0.9可能有意义,但在当前版本中,flask.session.NullSession该类用作错误信号.在您的情况下,它现在给您错误的错误消息.

SESSION_TYPE配置选项设置为其他选项.挑一个redis,memcached,filesystemmongodb,并确保其设置在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()
Run Code Online (Sandbox Code Playgroud)

如果您看到此错误而您没有使用Flask-Session,那么设置秘密就会出错.如果您正在设置app.config['SECRET_KEY']app.secret_keyif __name__ == "__main__":上面这样的警卫中并且您收到此错误,那么您可能正在通过WSGI服务器运行Flask应用程序,该服务器将Flask项目作为模块导入,并且该__name__ == "__main__"块永远不会运行.

它始终是更好地管理配置瓶的应用程序在一个单独的文件,反正.

  • 注意Heroku用户在这里结束:我没有得到这个例子,直到我把`app.secret_key = ...`移出_if_块 - 事后才有意义,因为Heroku通过gunicorn运行应用程序,这意味着永远不会输入`if __name__ =="__ main __":`block. (4认同)
  • 请注意,使用`app.secret_key`是不好的做法.最好通过`app.config`对象设置密钥,这使您可以将配置卸载到外部文件. (2认同)

hay*_*den 48

在外面设置密钥 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()
Run Code Online (Sandbox Code Playgroud)

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


Mig*_*uel 10

试试这个:

app = Flask(__name__)
app.config['SESSION_TYPE'] = 'memcached'
app.config['SECRET_KEY'] = 'super secret key'
sess = Session()
Run Code Online (Sandbox Code Playgroud)

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