Как прочитать асинхронный поток из неасинхронного метода?Python

Программы на Python
Anonymous
Как прочитать асинхронный поток из неасинхронного метода?

Сообщение Anonymous »

Для создания приложения я использую FastAPI. Одной из функций является загрузка файлов с помощью запроса PUT.
Fast API поддерживает загрузку файлов с помощью запросов POST (составная форма).
Но мне нужен запрос PUT, где файл — это просто тело запроса.< /p>
Я обнаружил, что могу использовать объект Request и существует методstream() для доступа к телу запроса.
Однако у меня есть проблема с асинхронным кодом. Остальная часть моего кода не асинхронна. Первоначально это было приложение WSGI.

Код: Выделить всё

@f_app.put("/share/{share_name}/file/upload")
def upload_file(request: Request, share_name:str):
path = request.headers.get("x-file-path","")

request.state.api_app.router.input.with_stream(request.stream())

return UploadAPIEndpoint(request.state.api_app).action("put",
share_name = share_name, path = path)

Этот код завершается с ошибкой

Код: Выделить всё

'async_generator' object has no attribute 'read'
Раньше этот код работал с WSGI, и это было

Код: Выделить всё

request.state.api_app.router.input.with_stream(environment['wsgi.input'])
Внутри этого метода выполняется операция read() для этого объекта (с аргументом with_stream()).
request.stream() «асинхронный» в FastAPI.
Как я могу решить эту проблему, не меняя свой код на асинхронный во многих местах?
Может быть, это можно сделать какой-то дополнительный класс, который будет работать как оболочка над асинхронным потоком?
Или, может быть, можно использовать некоторые приемы, такие как «каналы» или «очереди», для запуска двух параллельных сопрограмм? Один будет читать из асинхронного потока и помещать в очередь/канал, а мой основной код будет читать из этой общей очереди/канала?
Есть ли у вас примеры решения этой проблемы?

Подробнее здесь: https://stackoverflow.com/questions/790 ... ync-method

Вернуться в «Python»