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.
Flask_Login
|
|----member
| |----setting
| | |----__init__.py
| | |----form.py
| | |----model.py
| | |----view.py
| |
| |----static
| |----templates
| |----__init__.py
| |----sendmail.py
|
|----manage.py
|----config.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.
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
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.