烧瓶登录可以登录,但不记得登录会话



我现在正在学习烧瓶登录,我面临一些问题。当我的route没有设置@login_required时,我可以登录。当我设置@login_required并在登录后尝试重定向时,它会要求我再次登录。因此,我不确定我的烧瓶发生了什么
这是我的代码和floder结构。

浮冰结构

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 ':->'

我不确定这里需要在哪里设置session['username'] = user.usernamesession['login_in'] = True,以及是否正确设置,但如果它们都没有设置,烧瓶登录仍然不能像我预期的那样工作。

__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

终端

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 -

试试这个::

@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)

同时从init.py 中删除login_manager.session_protection = "strong"

编辑::进行此更改:删除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

我希望这能奏效:(

最新更新