Home > Net >  Flask-login users are being logged out at random when app is live (not when run local)
Flask-login users are being logged out at random when app is live (not when run local)

Time:09-20

I have a Flask app, with user Authentication. Its working fine when run in a venv but as soon as i deploy it as a google cloud app it starts logging users out at random, sometimes it can be minutes and other times it at one of the first requests.

Here are the most central parts of my app, I beleive the error must be here or in the App Engine configuration.

db=SQLAlchemy()


def create_app():
    app = Flask(__name__)
    app.config['SECRET_KEY'] = os.urandom(12)
    app.config['SQLALCHEMY_DATABASE_URI'] = "my_db_uri"
    db.init_app(app)

    from .views import views
    from .auth import auth

    app.register_blueprint(views, url_prefix='/')
    app.register_blueprint(auth, url_prefix='/')

    from .models import User

    login_manager = LoginManager(app)
    login_manager.login_view = 'auth.login'
    login_manager.init_app(app)


    @login_manager.user_loader
    def load_user(id):
        return User.query.get(int(id))

    return app

app = create_app()

if __name__ == '__main__':
    app.run(debug=True)


CodePudding user response:

I was using os.urandom() to generate a random secret key in a settings file.

The problem was solved when I changed it to a string.

I guess the problem was that App Engine is running several instances and got differend secret keys from time to time, which made the session cookie invalid and therefor cleared the cookie content.

CodePudding user response:

this link should show you how to set up environment variables on a production environment. https://dev.to/sasicodes/flask-and-env-22am

I think you are missing the os.getenv() which can be found by installing the dotenv module using pip install python-dotenv and importing it in your file either the config.py file or the file with the app engine configuration.

you can use the os.getenv as such

`
from dotenv import load_dotenv
load_dotenv()
db=SQLAlchemy()


def create_app():
    app = Flask(__name__)
    app.config['SECRET_KEY'] = os.getenv("my_secret_key")
    app.config['SQLALCHEMY_DATABASE_URI'] = os.getenv("my_db_uri")
    db.init_app(app)

    from .views import views
    from .auth import auth

    app.register_blueprint(views, url_prefix='/')
    app.register_blueprint(auth, url_prefix='/')

    from .models import User

    login_manager = LoginManager(app)
    login_manager.login_view = 'auth.login'
    login_manager.init_app(app)


    @login_manager.user_loader
    def load_user(id):
        return User.query.get(int(id))

    return app

app = create_app()

if __name__ == '__main__':
    app.run(debug=True)

`

  • Related