flask run. Ошибка при миграциях и запросах UnicodeDecodeError: 'utf-8' codec can't decode byte 0xdd in position 47: invalid continuation byte
Столкнулся с проблемой на проекте, использующем Flask, SQLAlchemy и PostgreSQL. Для разработки я запускал контейнер с PostgreSQL и запускал сам проект командой flask run. Всё работало: миграции выполнялись, запросы обрабатывались. Недавно я развернул проект на тестовом сервере в Docker, и он работал через Docker Compose.
Однако теперь я не могу запустить проект для разработки, используя просто контейнер с базой данных и flask run. На любой запрос, даже если база данных не запущена, возникает ошибка: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xdd in position 47: invalid continuation byte. Это явно проблема на моем ноуте(я так думаю), но я не могу понять, что именно произошло и с какого момента началась эта проблема. Вроде бы еще в пятницу мне казалось что flask run работал без проблем, а после этого я ничего не делал с проектом особо, кроме как поставил на тестовый сервер.. и именно этот образ программы я запускаю в контейнере.
Интересно, что даже когда контейнер с БД не запущен, попытка выполнить запрос через Postman или сделать миграции приводит к той же ошибке. При этом, если запустить Flask-приложение в контейнере, всё работает без проблем, и такой ошибки нет. Что может быть не так? В Google нахожу только случаи с подобной ошибкой при открытии файлов, но не при запросах локально. Надеюсь получилось объяснить. Буду благодарен за помощь!
Я пробовал запустить этот год через docker compose, предварительно упаковав его в image. И в контейнере этот код работает и не вызывает проблем, как локально, так и на сервере.
127.0.0.1 - - [09/Sep/2024 17:44:23] "GET /orders/?page=1&itemsOnPage=12&sortOrder=ASC HTTP/1.1" 500 - Traceback (most recent call last): File "d:\IT\commercial\project.venv\Lib\site-packages\flask\app.py", line 1498, in call return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "d:\IT\commercial\project.venv\Lib\site-packages\flask\app.py", line 1476, in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ File "d:\IT\commercial\project.venv\Lib\site-packages\flask_restful_init_.py", line 298, in error_router return original_handler(e) ^^^^^^^^^^^^^^^^^^^ File "d:\IT\commercial\project.venv\Lib\site-packages\flask_restful_init_.py", line 298, in error_router return original_handler(e) ^^^^^^^^^^^^^^^^^^^ File "d:\IT\commercial\project.venv\Lib\site-packages\flask_restful_init_.py", line 298, in error_router return original_handler(e) ^^^^^^^^^^^^^^^^^^^ [Previous line repeated 3 more times] File "d:\IT\commercial\project.venv\Lib\site-packages\flask_cors\extension.py", line 178, in wrapped_function return cors_after_request(app.make_response(f(*args, **kwargs))) ^^^^^^^^^^^^^^^^^^^^ File "d:\IT\commercial\project.venv\Lib\site-packages\flask_restful_init_.py", line 295, in error_router return self.handle_error(e) ^^^^^^^^^^^^^^^^^^^^ File "d:\IT\commercial\project.venv\Lib\site-packages\flask_restful_init_.py", line 310, in handle_error handle_flask_propagate_exceptions_config(current_app, e) File "d:\IT\commercial\project.venv\Lib\site-packages\flask\app.py", line 1473, in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "d:\IT\commercial\project.venv\Lib\site-packages\flask\app.py", line 882, in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "d:\IT\commercial\project.venv\Lib\site-packages\flask_restful_init.py", line 298, in error_router return original_handler(e) ^^^^^^^^^^^^^^^^^^^ File "d:\IT\commercial\project.venv\Lib\site-packages\flask_restful_init_.py", line 298, in error_router return original_handler(e) ^^^^^^^^^^^^^^^^^^^ File "d:\IT\commercial\project.venv\Lib\site-packages\flask_restful_init_.py", line 298, in error_router return original_handler(e) ^^^^^^^^^^^^^^^^^^^ [Previous line repeated 3 more times] File "d:\IT\commercial\project.venv\Lib\site-packages\flask_cors\extension.py", line 178, in wrapped_function return cors_after_request(app.make_response(f(*args, **kwargs))) ^^^^^^^^^^^^^^^^^^^^ File "d:\IT\commercial\project.venv\Lib\site-packages\flask_restful_init_.py", line 295, in error_router return self.handle_error(e) ^^^^^^^^^^^^^^^^^^^^ File "d:\IT\commercial\project.venv\Lib\site-packages\flask_restful_init_.py", line 310, in handle_error handle_flask_propagate_exceptions_config(current_app, e) File "d:\IT\commercial\project.venv\Lib\site-packages\flask\app.py", line 880, in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ File "d:\IT\commercial\project.venv\Lib\site-packages\flask\app.py", line 865, in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "d:\IT\commercial\project.venv\Lib\site-packages\flask_restful_init.py", line 489, in wrapper resp = resource(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^ File "d:\IT\commercial\project.venv\Lib\site-packages\flask\views.py", line 110, in view return current_app.ensure_sync(self.dispatch_request)(**kwargs) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "d:\IT\commercial\project.venv\Lib\site-packages\flask_restful_init_.py", line 604, in dispatch_request resp = meth(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ File "d:\IT\commercial\project.venv\Lib\site-packages\flask_jwt_extended\view_decorators.py", line 167, in decorator verify_jwt_in_request( File "d:\IT\commercial\project.venv\Lib\site-packages\flask_jwt_extended\view_decorators.py", line 94, in verify_jwt_in_request jwt_data, jwt_header, jwt_location = _decode_jwt_from_request( ^^^^^^^^^^^^^^^^^^^^^^^^^ File "d:\IT\commercial\project.venv\Lib\site-packages\flask_jwt_extended\view_decorators.py", line 368, in _decode_jwt_from_request verify_token_not_blocklisted(jwt_header, decoded_token) File "d:\IT\commercial\project.venv\Lib\site-packages\flask_jwt_extended\internal_utils.py", line 58, in verify_token_not_blocklisted if jwt_manager.token_in_blocklist_callback(jwt_header, jwt_data): ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\IT\commercial\project\boat_init.py", line 76, in check_if_token_revoked token = db.session.query(TokenBlocklist.id).filter_by(jti=jti).scalar() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "d:\IT\commercial\project.venv\Lib\site-packages\sqlalchemy\orm\query.py", line 2805, in scalar ret = self.one() ^^^^^^^^^^ File "d:\IT\commercial\project.venv\Lib\site-packages\sqlalchemy\orm\query.py", line 2778, in one return self._iter().one() # type: ignore ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "d:\IT\commercial\project.venv\Lib\site-packages\sqlalchemy\orm\query.py", line 2827, in _iter result: Union[ScalarResult[_T], Result[_T]] = self.session.execute( ^^^^^^^^^^^^^^^^^^^^^ File "d:\IT\commercial\project.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2362, in execute return self._execute_internal( ^^^^^^^^^^^^^^^^^^^^^^^ File "d:\IT\commercial\project.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2237, in _execute_internal conn = self._connection_for_bind(bind) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "d:\IT\commercial\project.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2106, in _connection_for_bind return trans._connection_for_bind(engine, execution_options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "", line 2, in _connection_for_bind File "d:\IT\commercial\project.venv\Lib\site-packages\sqlalchemy\orm\state_changes.py", line 139, in _go ret_value = fn(self, *arg, **kw) ^^^^^^^^^^^^^^^^^^^^ File "d:\IT\commercial\project.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 1189, in _connection_for_bind conn = bind.connect() ^^^^^^^^^^^^^^ File "d:\IT\commercial\project.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 3278, in connect return self._connection_cls(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^ File "d:\IT\commercial\project.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 146, in init self._dbapi_connection = engine.raw_connection() ^^^^^^^^^^^^^^^^^^^^^^^ File "d:\IT\commercial\project.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 3302, in raw_connection return self.pool.connect() ^^^^^^^^^^^^^^^^^^^ File "d:\IT\commercial\project.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 449, in connect return _ConnectionFairy._checkout(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "d:\IT\commercial\project.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 1263, in _checkout fairy = _ConnectionRecord.checkout(pool) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "d:\IT\commercial\project.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 712, in checkout rec = pool._do_get() ^^^^^^^^^^^^^^ File "d:\IT\commercial\project.venv\Lib\site-packages\sqlalchemy\pool\impl.py", line 179, in _do_get with util.safe_reraise(): File "d:\IT\commercial\project.venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 146, in exit raise exc_value.with_traceback(exc_tb) File "d:\IT\commercial\project.venv\Lib\site-packages\sqlalchemy\pool\impl.py", line 177, in _do_get return self._create_connection() ^^^^^^^^^^^^^^^^^^^^^^^^^ File "d:\IT\commercial\project.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 390, in _create_connection return _ConnectionRecord(self) ^^^^^^^^^^^^^^^^^^^^^^^ File "d:\IT\commercial\project.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 674, in init self.__connect() File "d:\IT\commercial\project.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 900, in __connect with util.safe_reraise(): File "d:\IT\commercial\project.venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 146, in exit raise exc_value.with_traceback(exc_tb) File "d:\IT\commercial\project.venv\Lib\site-packages\sqlalchemy\pool\base.py", line 896, in __connect self.dbapi_connection = connection = pool.invoke_creator(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^ File "d:\IT\commercial\project.venv\Lib\site-packages\sqlalchemy\engine\create.py", line 643, in connect return dialect.connect(*cargs, **cparams) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "d:\IT\commercial\project.venv\Lib\site-packages\sqlalchemy\engine\default.py", line 621, in connect return self.loaded_dbapi.connect(*cargs, **cparams) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "d:\IT\commercial\project.venv\Lib\site-packages\psycopg2_init.py", line 122, in connect conn = _connect(dsn, connection_factory=connection_factory, **kwasync) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UnicodeDecodeError: 'utf-8' codec can't decode byte 0xdd in position 47: invalid continuation byte