带有网络服务器的Flask打破了所有会话?

时间:2012-01-23 04:33:07

标签: python session flask lighttpd

例如,此代码:

from flask import session

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

在运行Flask的开发服务器时,它运行正常,但在任何服务器上都会在任何网络服务器设置(FastCGI,uWSGI等)上引发500错误(Apache,nginx ,Lighttpd)。

有人知道为什么吗?


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

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

3 个答案:

答案 0 :(得分:14)

我终于尝试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?'

答案 1 :(得分:1)

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

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

因此,要解决您的问题,请确保执行此操作:

bool

答案 2 :(得分:0)

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

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'))