Flask - Управление ролями пользователей. Ошибка типа: Объект типа Role не JSON, сериализуемый - PullRequest
0 голосов
/ 03 мая 2020

каждый

Я пытался узнать, как сделать управление ролью / аутентификацией более динамичным c, и я следовал документации Flask пользователя, найденной здесь:

https://flask-user.readthedocs.io/en/latest/basic_app.html

И мой код выглядит так, очень похоже на пример:

class UserModel(db.Model, UserMixin):
    __tablename__ = 'users'

    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80))
    email = db.Column(db.String(80))
    password = db.Column(db.String(80))
    status = db.Column(db.Boolean)
    roles = db.relationship('Role', secondary='user_roles')

    def __init__(self, username, password, email, status):
        self.username = username
        self.password = password
        self.email = email
        self.status = status

    def json(self):
        return {'username': self.username,
                'email': self.email,
                'status': self.status,
                'id': self.id,
                'roles': [self.roles]
                }

    def save_to_db(self):
        db.session.add(self)
        db.session.commit()

    def att_role(self, role):
        r = Role.search_by_name(role)
        self.roles = [r, ]
        db.session.commit()

    @classmethod
    def search_by_id(cls, _id):
        return cls.query.filter_by(id=_id).first()

    @classmethod
    def search_by_email(cls, email):
        return cls.query.filter_by(email=email).first()

    @classmethod
    def search_by_username(cls, username):
        return cls.query.filter_by(username=username).first()



class Role(db.Model):
    __tablename__ = 'roles'
    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.String(50), unique=True)

    @classmethod
    def search_by_name(cls, name):
        return cls.query.filter_by(name=name).first()


class UserRoles(db.Model):
    __tablename__ = 'user_roles'
    id = db.Column(db.Integer(), primary_key=True)
    user_id = db.Column(db.Integer(), db.ForeignKey('users.id', ondelete='CASCADE'))
    role_id = db.Column(db.Integer(), db.ForeignKey('roles.id', ondelete='CASCADE'))

И мой запрос выглядит так:

class UserRole(Resource):
    parser = reqparse.RequestParser()
    parser.add_argument('role', type=str, required=True, help="this field cannot be blank")

    def post(self, _id):
        data = UserRole.parser.parse_args()
        user = UserModel.search_by_id(_id)

        if user:
            user.att_role(data['role'])
            user.save_to_db()
            return {'message': 'user updated', 'user': user.json()}, 200

        return {'message': 'user not found'}, 404

Пока я получаю эту ошибку, и я не могу понять, почему!

  File "C:\Users\André Vieira\PycharmProjects\ProjectLion\venv\lib\site-packages\flask\app.py", line 2463, in __call__
    return self.wsgi_app(environ, start_response)
  File "C:\Users\André Vieira\PycharmProjects\ProjectLion\venv\lib\site-packages\flask\app.py", line 2449, in wsgi_app
    response = self.handle_exception(e)
  File "C:\Users\André Vieira\PycharmProjects\ProjectLion\venv\lib\site-packages\flask_restful\__init__.py", line 269, in error_router
    return original_handler(e)
  File "C:\Users\André Vieira\PycharmProjects\ProjectLion\venv\lib\site-packages\flask\app.py", line 1866, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "C:\Users\André Vieira\PycharmProjects\ProjectLion\venv\lib\site-packages\flask\_compat.py", line 38, in reraise
    raise value.with_traceback(tb)
  File "C:\Users\André Vieira\PycharmProjects\ProjectLion\venv\lib\site-packages\flask\app.py", line 2446, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Users\André Vieira\PycharmProjects\ProjectLion\venv\lib\site-packages\flask\app.py", line 1951, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\Users\André Vieira\PycharmProjects\ProjectLion\venv\lib\site-packages\flask_restful\__init__.py", line 269, in error_router
    return original_handler(e)
  File "C:\Users\André Vieira\PycharmProjects\ProjectLion\venv\lib\site-packages\flask\app.py", line 1820, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "C:\Users\André Vieira\PycharmProjects\ProjectLion\venv\lib\site-packages\flask\_compat.py", line 38, in reraise
    raise value.with_traceback(tb)
  File "C:\Users\André Vieira\PycharmProjects\ProjectLion\venv\lib\site-packages\flask\app.py", line 1949, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\Users\André Vieira\PycharmProjects\ProjectLion\venv\lib\site-packages\flask\app.py", line 1935, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "C:\Users\André Vieira\PycharmProjects\ProjectLion\venv\lib\site-packages\flask_restful\__init__.py", line 462, in wrapper
    return self.make_response(data, code, headers=headers)
  File "C:\Users\André Vieira\PycharmProjects\ProjectLion\venv\lib\site-packages\flask_restful\__init__.py", line 491, in make_response
    resp = self.representations[mediatype](data, *args, **kwargs)
  File "C:\Users\André Vieira\PycharmProjects\ProjectLion\venv\lib\site-packages\flask_restful\representations\json.py", line 21, in output_json
    dumped = dumps(data, **settings) + "\n"
  File "C:\Users\André Vieira\AppData\Local\Programs\Python\Python37-32\lib\json\__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "C:\Users\André Vieira\AppData\Local\Programs\Python\Python37-32\lib\json\encoder.py", line 201, in encode
    chunks = list(chunks)
  File "C:\Users\André Vieira\AppData\Local\Programs\Python\Python37-32\lib\json\encoder.py", line 431, in _iterencode
    yield from _iterencode_dict(o, _current_indent_level)
  File "C:\Users\André Vieira\AppData\Local\Programs\Python\Python37-32\lib\json\encoder.py", line 405, in _iterencode_dict
    yield from chunks
  File "C:\Users\André Vieira\AppData\Local\Programs\Python\Python37-32\lib\json\encoder.py", line 405, in _iterencode_dict
    yield from chunks
  File "C:\Users\André Vieira\AppData\Local\Programs\Python\Python37-32\lib\json\encoder.py", line 325, in _iterencode_list
    yield from chunks
  File "C:\Users\André Vieira\AppData\Local\Programs\Python\Python37-32\lib\json\encoder.py", line 325, in _iterencode_list
    yield from chunks
  File "C:\Users\André Vieira\AppData\Local\Programs\Python\Python37-32\lib\json\encoder.py", line 438, in _iterencode
    o = _default(o)
  File "C:\Users\André Vieira\AppData\Local\Programs\Python\Python37-32\lib\json\encoder.py", line 179, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type Role is not JSON serializable

Может кто-нибудь просветить меня, пожалуйста!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...