【问题标题】:Flask with a webserver breaks all sessions?带有网络服务器的烧瓶会中断所有会话吗?
【发布时间】:2012-01-23 04:33:06
【问题描述】:

例如这段代码:

from flask import session

@app.route('/is_logged_in/')
def is_logged_in():
  return 'user' in session

在运行 Flask 的开发服务器时它运行良好,但在任何服务器(Apache、nginx、Lighttpd )。

有人知道为什么吗?


如果重要的话,我的实际代码在 GitHub 上。

在使用 Flask 的内部服务器运行时,它可以完美运行,但我无法让任何会话变量与生产网络服务器一起使用:https://github.com/Blender3D/Webminal/blob/master/server.py

【问题讨论】:

  • 请提供错误的堆栈跟踪。您可以通过设置app.config['DEBUG'] = True 和/或查看服务器的错误日志来做到这一点。
  • 你能看到在 web 服务器上运行时请求是否在 is_logged_in() 中命中吗?很可能您的服务器规则阻止了路径。
  • @sjn:我使用的每个 URL 装饰器都有效,除了提到 session 的那些。我的fcgiwsgi 文件的配置中有app.debug = True,但仍然没有回溯。
  • 我认为这是会话问题的原因是因为我的 login 函数从未登录。我在各个阶段设置了 flash() 函数,但我永远无法成功保存会话变量(我的登录信息被接受,但会话永远不会开始)。

标签: python session flask lighttpd


【解决方案1】:

我终于尝试了Tornado,认为它可以帮助解决我的问题(毕竟它是用 Python 编写的)。

你瞧,一个可读的回溯:

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

看起来我只是忘了添加一个密钥来签署会话:

app.secret_key = 'why would I tell you my secret key?'

【讨论】:

  • daaaa...你刚刚告诉我你的秘密 ;-)
【解决方案2】:

您的返回值必须是以下几种类型之一:basestringstringunicode)、tuple(表示传递给 Response 对象的构造函数的参数)、Response对象本身,或者 - 失败 - 一个 WSGI 可调用函数。

您返回的是bool。 Flask 假设因为它不是 basestringtupleResponse 对象,所以它必须是 WSGI 可调用的。随后,在处理响应时,它会尝试调用()您的 bool 返回值,这会导致异常。 Flask 捕获生成的 TypeError。当 Flask 处于调试模式时,它会将其传回 Werkzeug 的简单网络服务器,该服务器将调用内置调试器。然而,当 Flask 处于生产模式时,它只会冒泡一个内部服务器错误——例如,代码 500——而没有更多信息。

因此,要解决您的问题,请确保您这样做:

return str('user' in session)

【讨论】:

  • 这只是对我的问题的过度简化,很抱歉造成误解。在我的代码中,如果我的用户未登录 (return redirect(url_for('index'))),我将呈现我的 index 页面,如果用户 登录则呈现实际页面(相同的逻辑)。
  • 查看我编辑的问题,了解我实际使用的代码。差别不大。
【解决方案3】:

虽然,它并没有真正回答你的问题,但我会这样重写它:

from flask import redirect, session, url_for

@app.route('/')
def index():
    return 'foo'

@app.route('/is_logged_in/')
def is_logged_in():
    user = session.get('user', None)
    if user:
        return user
    return redirect(url_for('index'))

【讨论】:

  • 'user' in session 检查user 是否是字典中的键,这是您的逻辑的单行版本。如果您能提供帮助,我的实际代码已被编辑到我的问题中。
猜你喜欢
  • 2019-05-19
  • 1970-01-01
  • 2021-09-04
  • 1970-01-01
  • 2020-08-14
  • 2018-11-24
  • 2017-08-10
  • 1970-01-01
  • 2018-08-18
相关资源
最近更新 更多