我正试图用FastAPI开发一个Python API,我必须在一个foor循环中从几个URL下载一系列图像
问题是我必须检索图像,但我不能这样做,因为这是一个普通for循环中的异步操作
这是我的密码:
@app.post("/v1/img_color")
async def img_color(request: Request):
body = await request.json()
images = []
for img in body['images']:
img_id = img['id']
img_url = img['url']
r = requests.get(img_url)
content = await r.content
dw_image = Image.open(BytesIO(content))
images.append(dw_image)
return images
但它给了我以下错误:
TypeError: object bytes can't be used in 'await' expression
我怎样才能解决这个问题?我已经搜索了这个问题,并找到了一些关于asyncio
的解决方案,但我无法使它们起作用
在建议从await r.content
中删除await
代码之后,我遇到了另一个错误,它说:
TypeError('cannot convert dictionary update sequence element #0 to a sequence'), TypeError('vars() argument must have dict attribute')
我不太明白这一点,因为我可以从原始POST请求的JSON主体中完美地检索url
Traceback (most recent call last):
File "d:\users\kendo\documents\git\empathy\kala_api\env\lib\site-packages\uvicorn\protocols\http\h11_impl.py", line 388, in run_asgi
result = await app(self.scope, self.receive, self.send)
File "d:\users\kendo\documents\git\empathy\kala_api\env\lib\site-packages\uvicorn\middleware\proxy_headers.py", line 45, in __call__
return await self.app(scope, receive, send)
File "d:\users\kendo\documents\git\empathy\kala_api\env\lib\site-packages\fastapi\applications.py", line 190, in __call__
await super().__call__(scope, receive, send)
File "d:\users\kendo\documents\git\empathy\kala_api\env\lib\site-packages\starlette\applications.py", line 111, in __call__
await self.middleware_stack(scope, receive, send)
File "d:\users\kendo\documents\git\empathy\kala_api\env\lib\site-packages\starlette\middleware\errors.py", line 181, in __call__
raise exc from None
File "d:\users\kendo\documents\git\empathy\kala_api\env\lib\site-packages\starlette\middleware\errors.py", line 159, in __call__
await self.app(scope, receive, _send)
File "d:\users\kendo\documents\git\empathy\kala_api\env\lib\site-packages\starlette\exceptions.py", line 82, in __call__
raise exc from None
File "d:\users\kendo\documents\git\empathy\kala_api\env\lib\site-packages\starlette\exceptions.py", line 71, in __call__
await self.app(scope, receive, sender)
File "d:\users\kendo\documents\git\empathy\kala_api\env\lib\site-packages\starlette\routing.py", line 566, in __call__
await route.handle(scope, receive, send)
File "d:\users\kendo\documents\git\empathy\kala_api\env\lib\site-packages\starlette\routing.py", line 227, in handle
await self.app(scope, receive, send)
File "d:\users\kendo\documents\git\empathy\kala_api\env\lib\site-packages\starlette\routing.py", line 41, in app
response = await func(request)
File "d:\users\kendo\documents\git\empathy\kala_api\env\lib\site-packages\fastapi\routing.py", line 196, in app
response_data = await serialize_response(
File "d:\users\kendo\documents\git\empathy\kala_api\env\lib\site-packages\fastapi\routing.py", line 124, in serialize_response
return jsonable_encoder(response_content)
File "d:\users\kendo\documents\git\empathy\kala_api\env\lib\site-packages\fastapi\encoders.py", line 102, in jsonable_encoder
jsonable_encoder(
File "d:\users\kendo\documents\git\empathy\kala_api\env\lib\site-packages\fastapi\encoders.py", line 140, in jsonable_encoder
return jsonable_encoder(
File "d:\users\kendo\documents\git\empathy\kala_api\env\lib\site-packages\fastapi\encoders.py", line 88, in jsonable_encoder
encoded_value = jsonable_encoder(
File "d:\users\kendo\documents\git\empathy\kala_api\env\lib\site-packages\fastapi\encoders.py", line 88, in jsonable_encoder
encoded_value = jsonable_encoder(
File "d:\users\kendo\documents\git\empathy\kala_api\env\lib\site-packages\fastapi\encoders.py", line 139, in jsonable_encoder
raise ValueError(errors)
ValueError: [TypeError('cannot convert dictionary update sequence element #0 to a sequence'), TypeError('vars() argument must have __dict__ attribute')]
requests.get()
是同步的。没有什么可以等待的。调用完成后,内容字节完全可用。移除await
如果你有冒险精神(或者想学习听写理解),你可以用一行替换整个循环
相关问题 更多 >
编程相关推荐