简体   繁体   中英

Flask-login can login but can't remember login session

I'm now learning flask-login now and I'm facing some questions. I can login when my route didn't set @login_required . While I set @login_required and try to redirect after login, it will ask me to login again. Therefore, I'm not sure what occurs about my flask.
Here is my code and my floder structure.

floder structure

Flask_Login
|
|----member
|       |----setting
|       |       |----__init__.py
|       |       |----form.py
|       |       |----model.py
|       |       |----view.py
|       |
|       |----static
|       |----templates
|       |----__init__.py
|       |----sendmail.py
|
|----manage.py
|----config.py

view.py

@app.route('/login', methods=['GET', 'POST'])
def login():
    form = FormLogin()
    if form.validate_on_submit():
        user = UserRegister.query.filter_by(email=form.email.data).first()
        if user:
            if user.check_password(form.password.data):
                login_user(user, form.remember_me.data)
                next = request.args.get('next')
                if not next_is_valid(next):
                    return ':-<'
                else:
                    session['username'] = user.username
                    session['login_in'] = True
                    return redirect(url_for('index'))
            else:
                flash('Wrong')
        else:
            flash('Wrong')
    return render_template('login/login.html', form=form)

def next_is_valid(url): 
    return True


@app.route('/')
@login_required
def index():
    return ':->'

I'm not sure wherether session['username'] = user.username and session['login_in'] = True need to be set here and correct set or not, but if they both not be set, flask-login still not working like I expected.

__init__.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_bootstrap import Bootstrap
from config import Config
from flask_migrate import Migrate
from flask_bcrypt import Bcrypt
from flask_mail import Mail
from flask_login import LoginManager
from datetime import timedelta

app = Flask(__name__)
app.config.from_object(Config)


mail = Mail(app)
bootstrap = Bootstrap(app)
db = SQLAlchemy(app)
bcrypt = Bcrypt(app)
migrate = Migrate(app, db)

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

@login_manager.user_loader
def load_user(userID):
    from member.setting.model import UserRegister
    try:
        return UserRegister.query.get(UserRegister.id==userID)
    except:
        return None

from .setting import view

Terminal

127.0.0.1 - - [12/Nov/2020 19:51:15] "GET / HTTP/1.1" 302 -
127.0.0.1 - - [12/Nov/2020 19:51:15] "GET /login?next=%2F HTTP/1.1" 200 -
127.0.0.1 - - [12/Nov/2020 19:51:24] "POST /login?next=%2F HTTP/1.1" 302 -
127.0.0.1 - - [12/Nov/2020 19:51:24] "GET / HTTP/1.1" 302 -
127.0.0.1 - - [12/Nov/2020 19:51:24] "GET /login?next=%2F HTTP/1.1" 200 -

Try this::

@app.route('/login', methods=['GET', 'POST'])
def login():
    form = FormLogin()
    if form.validate_on_submit():
        user = UserRegister.query.filter_by(email=form.email.data).first()
        if user:
            if user.check_password(form.password.data):
                login_user(user, form.remember_me.data)
                next = request.args.get('next')
                return redirect(next) if next else redirect(url_for('index'))
            else:
                flash('Wrong')
        else:
            flash('Wrong')
    return render_template('login/login.html', form=form)

Also remove login_manager.session_protection = "strong" from init.py

EDIT:: Make this change: Remove UserRegister.id==

@login_manager.user_loader
def load_user(userID):
    from member.setting.model import UserRegister
    try:
        return UserRegister.query.get(userID)
    except:
        return None

I hope this works:)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM