[32mINFO[0m: Will watch for changes in these directories: [‘E:\\fastapi’]
[32mINFO[0m: Uvicorn running on [1mhttp://127.0.0.1:8000[0m (Press CTRL+C to quit)
[32mINFO[0m: Started reloader process [[36m[1m23528[0m] using [36m[1mStatReload[0m
Process SpawnProcess-1:
Traceback (most recent call last):
File “D:\anaconda3\Lib\multiprocessing\process.py”, line 314, in _bootstrap
self.run()
File “D:\anaconda3\Lib\multiprocessing\process.py”, line 108, in run
self._target(*self._args, **self._kwargs)
File “D:\anaconda3\Lib\site-packages\uvicorn\_subprocess.py”, line 80, in subprocess_started
target(sockets=sockets)
File “D:\anaconda3\Lib\site-packages\uvicorn\server.py”, line 65, in run
return asyncio.run(self.serve(sockets=sockets))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “D:\anaconda3\Lib\asyncio\runners.py”, line 190, in run
return runner.run(main)
^^^^^^^^^^^^^^^^
File “D:\anaconda3\Lib\asyncio\runners.py”, line 118, in run
return self._loop.run_until_complete(task)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “D:\anaconda3\Lib\asyncio\base_events.py”, line 653, in run_until_complete
return future.result()
^^^^^^^^^^^^^^^
File “D:\anaconda3\Lib\site-packages\uvicorn\server.py”, line 69, in serve
await self._serve(sockets)
File “D:\anaconda3\Lib\site-packages\uvicorn\server.py”, line 76, in _serve
config.load()
File “D:\anaconda3\Lib\site-packages\uvicorn\config.py”, line 434, in load
self.loaded_app = import_from_string(self.app)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “D:\anaconda3\Lib\site-packages\uvicorn\importer.py”, line 19, in import_from_string
module = importlib.import_module(module_str)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “D:\anaconda3\Lib\importlib\__init__.py”, line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “<frozen importlib._bootstrap>”, line 1204, in _gcd_import
File “<frozen importlib._bootstrap>”, line 1176, in _find_and_load
File “<frozen importlib._bootstrap>”, line 1147, in _find_and_load_unlocked
File “<frozen importlib._bootstrap>”, line 690, in _load_unlocked
File “<frozen importlib._bootstrap_external>”, line 940, in exec_module
File “<frozen importlib._bootstrap>”, line 241, in _call_with_frames_removed
File “E:\fastapi\app\main.py”, line 3, in <module>
from .api.v1.routers import api_router
File “E:\fastapi\app\api\v1\routers.py”, line 2, in <module>
from .endpoints import chatbot, health
File “E:\fastapi\app\api\v1\endpoints\chatbot.py”, line 8, in <module>
from app.services.cache_service import get_cached_response, set_cached_response
File “E:\fastapi\app\services\cache_service.py”, line 1, in <module>
import aioredis
File “D:\anaconda3\Lib\site-packages\aioredis\__init__.py”, line 1, in <module>
from aioredis.client import Redis, StrictRedis
File “D:\anaconda3\Lib\site-packages\aioredis\client.py”, line 32, in <module>
from aioredis.connection import (
File “D:\anaconda3\Lib\site-packages\aioredis\connection.py”, line 33, in <module>
from .exceptions import (
File “D:\anaconda3\Lib\site-packages\aioredis\exceptions.py”, line 14, in <module>
class TimeoutError(asyncio.TimeoutError, builtins.TimeoutError, RedisError):
TypeError: duplicate base class TimeoutError
你遇到的报错是:
TypeError: duplicate base class TimeoutError
这是由于你当前使用的 aioredis
包版本存在问题。这个错误在新版 Python(如 3.11 或以上)上 使用旧版 aioredis
包 时会出现。
推荐方式(官方建议):
改用 redis
官方库 的异步方式,它已经集成了 asyncio
支持,并且取代了 aioredis
。
aioredis
已被废弃,功能已合并进redis
官方库(即pip install redis
)。
替换步骤
1. 卸载 aioredis:
pip uninstall aioredis
2. 安装 redis(>= 4.2.0):
pip install redis
3. 修改你的代码:
import aioredis
替换为
import redis.asyncio as redis
r = redis.Redis(host=’localhost’, port=6379, db=1)
# 异步调用
await r.set(‘key’, ‘value’)
val = await r.get(‘key’)