Flask-Login: не работает на локальной машине, но отлично работает на хостинге

У меня есть приложение flask, и я использую flask-login, следуя инструкциям (здесь ничего необычного)

  • нормально работает на хостинге
  • отлично работает на моем локальном компьютере MAC (дома)
  • не работает на моем локальном компьютере с Linux (в офисе, который может быть за брандмауэром, но я могу выполнять переадресацию портов и подключаться к базе данных)
  • не работает в Chrome или Firefox
  • не работает, если я работаю на localhost вместо 127.0.0.1.
from flask.ext.login import LoginManager 

login_manager = LoginManager()
login_manager.session_protection = "strong"
login_manager.init_app(app)
login_manager.login_view = 'login'

def login():
    error = None
    form = LoginForm()

    if request.method == 'POST':
        user = db.users.find_one({"username": form.username.data})
        pass_hash = generate_password_hash(form.password.data)

        if user and User.validate_login( pass_hash,  user['password'] ):
            user_obj = User(user['username'])
            session['logged_in'] = True
            login_user(user_obj,remember=True)
            flash("Logged in successfully", category='success')
            print 'logged in: OK'

            #return redirect(request.args.get("next") or url_for("index"))
            return redirect( url_for("index"))
        error = 'Invalid credentials'
    return render_template('login.html', title='login', **locals())

ну, когда я неправильно ввожу свой пароль, он выдает ошибку «Неверные учетные данные». Когда я правильно ввожу свой пароль, я не вижу мигающего сообщения «Вход выполнен успешно», но в консоли я вижу «Вход выполнен успешно». Так что проблем с подключением к БД нет. Однако я не вошел в систему. Например,

g.user.is_authenticated()

выдает false в шаблоне (такое происходит только на моем локальном линуксе, с другой стороны хостинг и MAC успешно логинит пользователя).


person Emmet B    schedule 06.07.2015    source источник
comment
Похоже, вы используете mongodb (но я могу ошибаться). Можете ли вы добавить операторы печати для печати user и pass_hash перед этой строкой, если user и User.validate_login(pass_hash, user['password']): или используйте отладчик python, чтобы проверить, возвращает ли база данных то, что вы ожидаете!   -  person skippy    schedule 06.07.2015
comment
@skippy да, я все правильно понимаю, я тоже правильно понимаю пользовательский объект.   -  person Emmet B    schedule 06.07.2015
comment
Хммм, так что, глядя на ваш код, если бы вы могли пройти проверку, если пользователь и User.validate_login(pass_hash, user['password']): вы должны увидеть Logged in Success . Итак, если вы можете правильно получить свои объекты, как и ожидалось от вашей базы данных, то вы терпите неудачу в своем предложении if. Чтобы быть точным, вы не проходите эту проверку User.validate_login(pass_hash, user['password']). Можете ли вы войти в этот код и проверить, возвращает ли он False ?   -  person skippy    schedule 06.07.2015
comment
@skippy спасибо, но я не ошибаюсь в условии if. Как я уже упоминал в вопросе, на консоли я вижу, что вы вошли в систему: ОК, так что если с пунктом все в порядке. Должно быть что-то еще, чего я не знаю.   -  person Emmet B    schedule 06.07.2015
comment
О, я пропустил это в вашем описании. Виноват ! Что ж, если флэш-сообщение не отображается на веб-странице, вы, вероятно, могли бы просмотреть его исходный код html и проверить, действительно ли сообщение попало туда. Я предполагаю, что вы используете jinja в качестве механизма шаблонов на стороне клиента, и я пока не видел никаких аномалий с jinja на linux/mac. Но если источник html действительно не расширяет флэш-сообщение, я бы использовал отладчик на стороне клиента, такой как Firebug/chrome-debugger, чтобы проверить, есть ли какие-либо исключения. Я бы сделал то же самое в Firefox и Chrome и проверил бы, соответствует ли поведение   -  person skippy    schedule 06.07.2015
comment
Похоже проблема с сессией. Это повлияет как на логин, так и на флэш-сообщения. Вы упомянули переадресацию портов. Вы выполняете переадресацию на тот же порт, например, с 5000 на 5000, или на другой порт, например, с 80 на 5000?   -  person dirn    schedule 06.07.2015
comment
@dirn yes похоже на сеанс. Да, он перенаправляет тот же порт. Хорошо, если я переадресую на неправильный порт, он не сможет прочитать из базы данных. Но в настоящее время он читает из базы данных.   -  person Emmet B    schedule 07.07.2015
comment
Какая у вас User модель? В частности, какова ваша реализация is_authenticated()?   -  person Peter Brittain    schedule 14.07.2015


Ответы (2)


Где и как вы сохраняете сессию в браузере?

Рассмотрим сеанс, сохраненный в файле cookie браузера для рабочего домена example.com, который вы также настроили локально (путем добавления переопределения в файл /etc/hosts).

Если ваш офисный сервер настроен на использование другого поддомена, например office.example.com, а REMEMBER_COOKIE_DOMAIN установлен на example.com, офисный сервер не сможет прочитать файл cookie. Исправление заключается в использовании междоменного файла cookie: REMEMBER_COOKIE_DOMAIN=.example.com (обратите внимание на предыдущую точку).

Ссылка: https://flask-login.readthedocs.org/en/latest/#cookie-settings

person knite    schedule 16.07.2015

С сессиями приходит управление сессиями...

  • Are you using a client-based session management?
    • possible issues with the cookies e.g. cookie size, too much data in cookie
    • возможные проблемы с секретным ключом сервера, например. генерация нового секретного ключа каждый раз
  • Are you using server-based session management (e.g. flask-kvsession)?
    • possible issues trying to access the same backend as prod e.g. firewall preventing access to a redis server

Возможно, вы пытаетесь сохранить больше данных сеанса при обращении к серверу разработки (например, более длинные URL-адреса сервера, данные отладки и т. д.), с чем может быть сложно справиться, когда управление сеансом выполняется на клиенте.

person dnozay    schedule 16.07.2015