当前位置: 首页 > 面试题库 >

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

姬国安
2023-03-14
问题内容

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

问题答案:

在您的情况下,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应用程序的配置。



 类似资料:
  • 问题内容: 当我连接到我的站点时,出现以下错误: RuntimeError:会话不可用,因为未设置任何秘密密钥。将应用程序上的secret_key设置为唯一且秘密的内容。 下面是我的服务器代码。 如您所见,我确实设置了应用密钥。我究竟做错了什么? 还有其他会话选项吗? 其他信息:在Linux Mint上运行Python 2.7 全贴: 问题答案: 在你的情况下,会话实现会引发异常,这是使用Flas

  • Flask通常被称为微框架,因为核心功能包括基于Werkzeug的WSGI和路由以及基于Jinja2的模板引擎。 此外,Flask框架还支持cookie和会话以及Web助手,如JSON,静态文件等。显然,这对于开发完整的Web应用程序来说还不够。 这是为什么还要Flask扩展插件。 Flask扩展为Flask框架提供了可扩展性。 Flask有大量的扩展可用。 Flask扩展是一个Python模块,

  • Flask 扩展用多种不同的方式扩充 Flask 的功能。比如加入数据库支持和其它的 常见任务。 寻找扩展 Flask Extension Registry 中列出了 Flask 扩展,并且可以通过 easy_install 或 pip 下载。如果你把一个 Flask 扩展添加到 requirements.rst 或 setup.py 文件的依赖关系中,它们通常可以用一个 简单的命令或是在你应用安

  • 与Cookie不同,会话数据存储在服务器上。 会话是客户端登录到服务器并注销的时间间隔。 需要在此会话中进行的数据存储在服务器上的临时目录中。 与每个客户端的会话分配一个会话ID。 会话数据存储在cookie顶部,服务器以加密方式签名。 对于这种加密,Flask应用程序需要一个定义。 会话对象也是一个包含会话变量和关联值的键值对的字典对象。 例如,要设置会话变量,请使用语句 - 要删除会话变量,请

  • 问题内容: 如果未设置,则Flask将不允许你设置或访问会话字典。 这是烧瓶使用者指南必须针对此主题说的所有内容。 我对Web开发非常陌生,我不知道任何/为什么安全性工作原理。我想了解Flask在幕后所做的事情。 为什么Flask强迫我们设置此属性? Flask如何使用该property? 问题答案: 任何需要加密的内容(为了安全防范攻击者的篡改)都需要设置密钥。对于刚刚瓶本身,即“什么”是对象,

  • Flask,一个微框架,通常需要一些重复的步骤来让第三方库工作。因为在很多时候, 这些步骤可以被分离出,来支持多个项目,就有了 Flask Extension Registry 。 如果你想要为还没有的功能创建你自己的 Flask 扩展,这份扩展开发指南会帮助你 在很短的时间内让你的应用跑起来并且感到像用户一样期待你的扩展运转。 剖析扩展 所有的扩展都位于一个叫做 flask_something