Колба в докере: Непредвиденная ошибка типа: Объект типа Строка не сериализуется в формате JSON

#python #docker #flask #flask-sqlalchemy

#питон #докер #колба #колба-sqlalchemy

Вопрос:

Изменить: Удалось обойти проблему, вернув один список с целыми числами, а не список кортежей, содержащих целые числа, — то есть то, что вернул query.all (). Тем не менее, мне все еще любопытно, почему первоначальная проблема возникла в Docker, но не при локальном выполнении.

При вызове определенной функции get сервера Flask в Docker я получаю ошибку в названии. При запуске сервера за пределами Docker ошибка не воспроизводима ни на компьютере с Windows, на котором она была написана, ни на чистой машине ubuntu. Ошибка вызвана попыткой вернуть результат запроса бд при вызове dbImage.query.with_entities(dbImage.id).all() , но я не понимаю, почему это так. Другие операции с БД работают просто отлично, такие как db_image = dbImage.query.filter(dbImage.id == image_id).one()

Обратная связь:

 Traceback (most recent call last):  File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 2464, in __call__  return self.wsgi_app(environ, start_response)  File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 2450, in wsgi_app  response = self.handle_exception(e)  File "/usr/local/lib/python3.8/site-packages/flask_restx/api.py", line 671, in error_router  return original_handler(f)  File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 1867, in handle_exception  reraise(exc_type, exc_value, tb)  File "/usr/local/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise  raise value  File "/usr/local/lib/python3.8/site-packages/flask_restx/api.py", line 669, in error_router  return self.handle_error(e)  File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 2447, in wsgi_app  response = self.full_dispatch_request()  File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 1952, in full_dispatch_request  rv = self.handle_user_exception(e)  File "/usr/local/lib/python3.8/site-packages/flask_restx/api.py", line 671, in error_router  return original_handler(f)  File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 1821, in handle_user_exception  reraise(exc_type, exc_value, tb)  File "/usr/local/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise  raise value  File "/usr/local/lib/python3.8/site-packages/flask_restx/api.py", line 669, in error_router  return self.handle_error(e)  File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 1950, in full_dispatch_request  rv = self.dispatch_request()  File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 1936, in dispatch_request  return self.view_functions[rule.endpoint](**req.view_args)  File "/usr/local/lib/python3.8/site-packages/flask_restx/api.py", line 407, in wrapper  return self.make_response(data, code, headers=headers)  File "/usr/local/lib/python3.8/site-packages/flask_restx/api.py", line 430, in make_response  resp = self.representations[mediatype](data, *args, **kwargs)  File "/usr/local/lib/python3.8/site-packages/flask_restx/representations.py", line 25, in output_json  dumped = dumps(data, **settings)   "n"  File "/usr/local/lib/python3.8/json/__init__.py", line 234, in dumps  return cls(  File "/usr/local/lib/python3.8/json/encoder.py", line 201, in encode  chunks = list(chunks)  File "/usr/local/lib/python3.8/json/encoder.py", line 429, in _iterencode  yield from _iterencode_list(o, _current_indent_level)  File "/usr/local/lib/python3.8/json/encoder.py", line 325, in _iterencode_list  yield from chunks  File "/usr/local/lib/python3.8/json/encoder.py", line 438, in _iterencode  o = _default(o)  File "/usr/local/lib/python3.8/json/encoder.py", line 179, in default  raise TypeError(f'Object of type {o.__class__.__name__} ' TypeError: Object of type Row is not JSON serializable  

Конечная точка, вызывающая ошибку, когда вызывается GET api/image/изображения (строка 4)

 @ns.route('/images') class Images(Resource):  @ns.doc('Get list of available image IDs')  def get(self):  return dbImage.query.with_entities(dbImage.id).all()  @ns.doc('Upload a single image, no other payload required')  @ns.expect(upload_parser)  def post(self):  args = upload_parser.parse_args()  image_file = args['file'] # This is FileStorage instance  testname = image_file.filename  image_id = create_cutout(image_file)  return str(image_id), 200  @ns.route('/lt;int:image_idgt;') class Image(Resource):  @ns.doc('Get single image by ID')  def get(self, image_id):    try:  db_image = dbImage.query.filter(dbImage.id == image_id).one()  except Exception as e:  return e, 500  filename = db_image.filepath  return send_file(os.path.join(settings.UPLOAD_FOLDER, filename), mimetype='image/png')  def delete(self, image_id):  image = dbImage.query.filter_by(id=image_id).first()  try:  delete_cutout(image.filepath)  except Exception as e:  print(e)  db.session.delete(image)  db.session.commit()  

Комментарии:

1. dbImage.query.with_entities(dbImage.id).all() должно быть кодируемое значение JSON, так как вы возвращаете его в качестве HTTP-ответа. Во всех остальных случаях вы формируете ответ, отличный от отправки строки базы данных.

2. Главное, что он отлично работает на местном уровне. Когда я запускаю его из CLI, я получаю: curl 127.0.0.1:5000/api/image/images [[1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [12], [13], [14], [15]]