账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    flask 基于token 获取用户角色 返回报错
    34
    0

    数据库设计:

    db = SQLAlchemy()
    
    roles_users = db.Table(
        'roles_users',
        db.Column('user_id',db.Integer(),db.ForeignKey('users.id')),
        db.Column('role_id',db.Integer(),db.ForeignKey('roles.id'))
    )
    
    class Role(db.Model,RoleMixin):
        """创建角色模型类"""
        __tablename__ = 'roles'
     
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(64), unique=True)
        description = db.Column(db.String(255))
     
        def __init__(self):
            self.name = name
       
    
        def __repr__(self):
             return '%r' % self.name
      
    
    class User(db.Model, UserMixin):   
        __tablename__ = 'users'
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(30), unique=True)
        email = db.Column(db.String(64), unique=True)
        password = db.Column(db.Text,nullable=False)
        last_login_at = db.Column(db.DateTime, default=datetime.utcnow)
        current_login_at = db.Column(db.DateTime)
        last_login_ip = db.Column(db.String(100))
        current_login_ip = db.Column(db.String(100))
        login_count = db.Column(db.Integer)
        active = db.Column(db.Boolean())
        status = db.Column(db.String(64))
        confirmed_at = db.Column(db.DateTime, default=datetime.now())
        roles = db.relationship('Role',secondary='roles_users',backref=db.backref('users',lazy='dynamic'))
    
        def __init__(self, name=None, email=None):
            self.name = name
            self.email = email
            self.roles = roles 
       
        def to_json(self):       
            
            json_data = {
                'id': self.id,
                'name': self.name,
                'roles':self.roles,
                'email': self.email,
                'status': self.status,
                'active': self.active, 
                'confirmed_at': self.confirmed_at, 
                'current_login_at': self.current_login_at, 
                'current_login_ip': self.current_login_ip,
                'last_login_at': self.last_login_at, 
                'last_login_ip': self.last_login_ip, 
                'login_count': self.login_count,  
                'status': self.status
            }
    
            return json_data
    
    
        @staticmethod
        def verify_auth_token(token):
            s = Serializer(current_app.config['SECRET_KEY'])
            try:
                data = s.loads(token)
            except SignatureExpired:
                return None # valid token, but expired
            except BadSignature:
                return None # invalid token
            user = User.query.get(data['id'])        
            return user
            
     
     请求返回:
    @user.route('/info', methods=['GET', 'POST'])
    # @login_required 
    def userinfo():
       
        token=request.args.get('token')       
            
        if not token:
            return jsonify({'status':201,'state':0,'msg':'用户不存在'})   
            
        else:
            data = User.verify_auth_token(token)        
            return jsonify({'status':200,'state':1,'msg':'获取用户数据成功','data': data.to_json()})
            
    

    报错: TypeError: Object of type Role is not JSON serializable
    为何呢? 有人遇到吗?

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 剑言散人 普通会员 1楼

      在 Flask 中,你可以使用 Flask-Login 模块来实现用户角色的获取和返回。以下是一个简单的示例:

      ```python from flask import Flask, request, redirect, url_for, flash from flask_login import LoginManager, login_user, current_user from flask_sqlalchemy import SQLAlchemy from flask_login import UserMixin

      app = Flask(name) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db' db = SQLAlchemy(app)

      class User(UserMixin, db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True, nullable=False) role = db.Column(db.String(20), nullable=False)

      @login_manager.user_loader def load_user(user_id): return User.query.get(int(user_id))

      @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] user = User.query.filter_by(username=username, password=password).first() if user: login_user(user) return redirect(url_for('index')) else: flash('Invalid username or password') return render_template('login.html')

      if name == 'main': app.run(debug=True) ```

      在这个示例中,我们首先导入了 Flask 和相关模块。然后,我们定义了一个 User 类,它继承自 Flask 的 User 模型,并定义了角色(role)字段。我们还定义了一个 LoginManager 组件,它用于管理登录状态。最后,我们定义了一个路由,当用户访问 '/login' 端点时,它会处理登录请求。

      在 login 函数中,我们首先检查请求方法是否为 POST。如果是,我们从请求表单中获取用户名和密码。然后,我们使用 Flask-Login 的 ORM 模块查询数据库,找到具有给定用户名和密码的用户。如果找到用户,我们就登录用户并重定向到首页。否则,我们使用 flash 函数显示一个错误消息。

      注意,这个示例假设你的 Flask 应用已经包含了 Flask-Login 模块,并且已经在应用程序中正确地加载了数据库。如果这些假设不成立,你需要根据你的具体需求进行修改。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部