flask-login中load-user的参数remember为flase时,无法执行load_user?

问题描述

我做了一个微信扫描登录的功能。扫码成功后,判断数据库是否有该用户,没有的话,添加一个用户。然后执行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页

阅读 3.1k
1 个回答

又把user_loader打印了一下

@login.user_loader
def load_user(id):
    print('=========load_user===========')
    user = User.query.get(int(id))
    print('USER_LOADER', user)
    return user

发现user是个None?这个id到底是个什么东西?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题