问题描述
我做了一个微信扫描登录的功能。扫码成功后,判断数据库是否有该用户,没有的话,添加一个用户。然后执行login_user(user),跳转到首页。发现,如果login_user不给remember参数赋值为True的话,就一直跳转到扫码登录页。按理说,我login_user(user)后,会执行load_user的,但是没有。只有赋值了remember = True才会执行load_user。
问题出现的环境背景及自己尝试过哪些方法
- python 3.7
- Flask==1.0.2
- Flask-Bootstrap==3.3.7.1
- Flask-Login==0.4.1
- Flask-Migrate==2.3.0
- Flask-Moment==0.6.0
- Flask-SQLAlchemy==2.3.2
- Flask-WTF==0.14.2
相关代码
// 请把代码文本粘贴到下方(请勿用图片代替代码)
- 模型 models.py
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key = True)
username = db.Column(db.String(64), index = True, unique = True)
email = db.Column(db.String(120), index=True, unique=True)
password_hash = db.Column(db.String(128))
about_me = db.Column(db.String(140))
last_seen = db.Column(db.DateTime, default=datetime.utcnow)
# 20181206 定义一部分微信用户数据
userid = db.Column(db.String(10))
deptid = db.Column(db.Integer, db.ForeignKey('dept.id'))
posts = db.relationship('Post', backref='author',lazy='dynamic')
- 我一直没搞明白这个load_user的id是什么?从哪里给它传的参数?是数据库?
@login.user_loader
def load_user(id):
print('=========load_user===========')
return User.query.get(int(id))
- 路由auth/login
@bp.route('/login', methods = ['GET','POST'])
def login():
if current_user.is_authenticated:
print('authenticated')
return redirect(url_for('main.index'))
return render_template('auth/wxlogin.html')
- 扫码验证路由
@bp.route('/oauth', methods = ['GET','POST'])
def get_from_wechat():
# 获取code
code = request.args.get('code')
print('code:%s' % code)
# 根据微信的API,获取code后,用code换取用户信息
url = current_app.config['WECHAT_SERVER'] + '/getuser/' + code
response = requests.get(url)
user_json = json.loads(response.text)
print(user_json)
if user_json['errcode'] == 0:
# 思路:先查询数据库是否存在用户,没有则增加一个,否则读取
user = User.query.filter_by(userid=user_json['userid']).first()
print('oauth:', user)
if user is None:
print('add user:')
user = User(username=user_json['name'], email=user_json['userid'] + '@qq.com' )
user.set_password('Abc123')
user.userid = user_json['userid']
user.about_me = user_json['avatar']
user.deptid = 6
db.session.add(user)
db.session.commit()
login_user(user, remember=False)
print(current_user.is_anonymous)#打印当前用户是否匿名也是False
return redirect(url_for('main.index'))
else:
return render_template('errors/404.html')
return render_template('auth/wxlogin.html')
#return redirect(url_for('main.index'))
- index.html
{% extends "base.html" %}
{% import 'bootstrap/wtf.html' as wtf %}
{% block app_content %}
<h2>{{ current_user.username }}</h2>
{% endblock %}
你期待的结果是什么?实际看到的错误信息又是什么?
我希望扫码成功后,跳转到Index.html页
又把user_loader打印了一下
发现user是个None?这个id到底是个什么东西?