Объект Security()
никогда не является прямым атрибутом объекта приложения Flask. Ваша ошибка здесь в том, что app
- это Blueprint
объект, что еще больше сбивает с толку. Вы обычно должны не использовать app
для объекта чертежа в любом случае.
Вы можете импортировать объект из модуля, где вы сначала создаете экземпляр Security(...)
, или вы можете получить к нему доступ через отображение Flask extensions
через current_app
ссылка :
from flask import current_app
security = current_app.extensions['security'] # or reference .datastore, etc.
Далее, как правило, вы хотите зафиксировать доступ после завершения ответа , поскольку это помогает получить более быстрый результат для конечного пользователя и позволяет также записывать состояние ответа. Используйте функцию after_this_request()
для запуска фиксации после ответа:
from flask import current_app, after_this_request
def flask_security_datastore_commit(response=None):
datastore = current_app.extensions['security'].datastore
datastore.commit()
return response
и по вашему мнению используйте:
if verify_password(request.form['password'], user.password):
login_user(user)
after_this_request(flask_security_datastore_commit)
return "Logged in"