каждый
Я пытался узнать, как сделать управление ролью / аутентификацией более динамичным 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
Может кто-нибудь просветить меня, пожалуйста!