Колба с веб-сервером разрывает все сессии - PullRequest
4 голосов
/ 23 января 2012

Например, этот код:

from flask import session

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

Он работает нормально для меня при работе с сервером разработки Flask, но выдает ошибку 500 с любым установкой веб-сервера (FastCGI, uWSGI и т. Д.) На любом сервере (Apache, nginx, Lighttpd) .

Кто-нибудь знает почему?


Мой настоящий код на GitHub, если это имеет значение.

Он работает безупречно при работе с внутренним сервером Flask, но я не могу заставить переменные сеанса работать с рабочим веб-сервером: https://github.com/Blender3D/Webminal/blob/master/server.py

Ответы [ 3 ]

14 голосов
/ 24 января 2012

Я наконец-то попробовал Торнадо , думая, что это поможет с моими проблемами (в конце концов, он написан на 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 голос
/ 23 января 2012

Возвращаемое значение должно быть одного из нескольких типов: basestring (string или unicode), tuple (представляющий аргументы, переданные конструктору объекта Response), Responseсам объект или, в случае неудачи, вызываемая WSGI функция.

Вы возвращаете bool.Flask предполагает, что, поскольку это не объект basestring, tuple или Response, он должен вызываться WSGI.Впоследствии при обработке ответа он пытается вызвать () ваше bool возвращаемое значение, что приводит к исключению.Flask ловит полученную ошибку TypeError.Когда Flask находится в режиме отладки, он передает его обратно на простой веб-сервер Werkzeug, который запускает встроенный отладчик.Однако, когда Flask находится в рабочем режиме, он просто выдает внутреннюю ошибку сервера - например, код 500 - без дополнительной информации.

Итак, чтобы устранить проблему, убедитесь, что вы делаете этовместо:

return str('user' in session)

0 голосов
/ 23 января 2012

Хотя, на самом деле это не отвечает на ваш вопрос, я бы переписал это так:

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