#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]]