Skip to content

Commit 8c6d04e

Browse files
tasnXiretza
authored andcommitted
Replace aioredis with redis-py
aioredis has been merged into redis-py and will no longer be maintained as a separate project.
1 parent 2f1f95f commit 8c6d04e

File tree

4 files changed

+30
-20
lines changed

4 files changed

+30
-20
lines changed

etebase_server/fastapi/redis.py

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import typing as t
2-
import aioredis
2+
from redis import asyncio as aioredis
33

44
from etebase_server.django import app_settings
55

@@ -12,12 +12,11 @@ def __init__(self, redis_uri: t.Optional[str]):
1212

1313
async def setup(self):
1414
if self.redis_uri is not None:
15-
self.redis = await aioredis.create_redis_pool(self.redis_uri)
15+
self.redis = await aioredis.from_url(self.redis_uri)
1616

1717
async def close(self):
1818
if hasattr(self, "redis"):
19-
self.redis.close()
20-
await self.redis.wait_closed()
19+
await self.redis.close()
2120

2221
@property
2322
def is_active(self):

etebase_server/fastapi/routers/websocket.py

+15-11
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import asyncio
22
import typing as t
33

4-
import aioredis
4+
from redis import asyncio as aioredis
5+
from redis.exceptions import ConnectionError
56
from asgiref.sync import sync_to_async
67
from django.db.models import QuerySet
78
from fastapi import APIRouter, Depends, WebSocket, WebSocketDisconnect, status
@@ -51,7 +52,7 @@ async def get_ticket(
5152
uid = nacl.encoding.URLSafeBase64Encoder.encode(nacl.utils.random(32))
5253
ticket_model = TicketInner(user=user.id, req=ticket_request)
5354
ticket_raw = msgpack_encode(ticket_model.dict())
54-
await redisw.redis.set(uid, ticket_raw, expire=TICKET_VALIDITY_SECONDS * 1000)
55+
await redisw.redis.set(uid, ticket_raw, ex=TICKET_VALIDITY_SECONDS * 1000)
5556
return TicketOut(ticket=uid)
5657

5758

@@ -103,9 +104,9 @@ async def send_item_updates(
103104

104105
async def redis_connector(websocket: WebSocket, ticket_model: TicketInner, user: UserType, stoken: t.Optional[str]):
105106
async def producer_handler(r: aioredis.Redis, ws: WebSocket):
107+
pubsub = r.pubsub()
106108
channel_name = f"col.{ticket_model.req.collection}"
107-
(channel,) = await r.psubscribe(channel_name)
108-
assert isinstance(channel, aioredis.Channel)
109+
await pubsub.subscribe(channel_name)
109110

110111
# Send missing items if we are not up to date
111112
queryset: QuerySet[models.Collection] = get_collection_queryset(user)
@@ -117,12 +118,20 @@ async def producer_handler(r: aioredis.Redis, ws: WebSocket):
117118
return
118119
await send_item_updates(websocket, collection, user, stoken)
119120

121+
async def handle_message():
122+
msg = await pubsub.get_message(ignore_subscribe_messages=True, timeout=20)
123+
message_raw = t.cast(t.Optional[t.Tuple[str, bytes]], msg)
124+
if message_raw:
125+
_, message = message_raw
126+
await ws.send_bytes(message)
127+
120128
try:
121129
while True:
122130
# We wait on the websocket so we fail if web sockets fail or get data
123131
receive = asyncio.create_task(websocket.receive())
124132
done, pending = await asyncio.wait(
125-
{receive, channel.wait_message()}, return_when=asyncio.FIRST_COMPLETED
133+
{receive, handle_message()},
134+
return_when=asyncio.FIRST_COMPLETED,
126135
)
127136
for task in pending:
128137
task.cancel()
@@ -131,12 +140,7 @@ async def producer_handler(r: aioredis.Redis, ws: WebSocket):
131140
await websocket.close(code=status.WS_1008_POLICY_VIOLATION)
132141
return
133142

134-
message_raw = t.cast(t.Optional[t.Tuple[str, bytes]], await channel.get())
135-
if message_raw:
136-
_, message = message_raw
137-
await ws.send_bytes(message)
138-
139-
except aioredis.errors.ConnectionClosedError:
143+
except ConnectionError:
140144
await websocket.close(code=status.WS_1012_SERVICE_RESTART)
141145
except WebSocketDisconnect:
142146
pass

requirements.in/base.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@ fastapi
55
typing_extensions
66
uvicorn[standard]
77
aiofiles
8-
aioredis
8+
redis>=4.2.0rc1

requirements.txt

+11-4
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
#
77
aiofiles==0.8.0
88
# via -r requirements.in/base.txt
9-
aioredis==2.0.1
10-
# via -r requirements.in/base.txt
119
anyio==3.5.0
1210
# via
1311
# starlette
@@ -17,11 +15,13 @@ asgiref==3.5.0
1715
# django
1816
# uvicorn
1917
async-timeout==4.0.2
20-
# via aioredis
18+
# via redis
2119
cffi==1.15.0
2220
# via pynacl
2321
click==8.0.4
2422
# via uvicorn
23+
deprecated==1.2.13
24+
# via redis
2525
django==3.2.13
2626
# via -r requirements.in/base.txt
2727
fastapi==0.75.0
@@ -34,18 +34,24 @@ idna==3.3
3434
# via anyio
3535
msgpack==1.0.3
3636
# via -r requirements.in/base.txt
37+
packaging==21.3
38+
# via redis
3739
pycparser==2.21
3840
# via cffi
3941
pydantic==1.9.0
4042
# via fastapi
4143
pynacl==1.5.0
4244
# via -r requirements.in/base.txt
45+
pyparsing==3.0.9
46+
# via packaging
4347
python-dotenv==0.19.2
4448
# via uvicorn
4549
pytz==2022.1
4650
# via django
4751
pyyaml==6.0
4852
# via uvicorn
53+
redis==4.3.4
54+
# via -r requirements.in/base.txt
4955
sniffio==1.2.0
5056
# via anyio
5157
sqlparse==0.4.2
@@ -55,7 +61,6 @@ starlette==0.17.1
5561
typing-extensions==4.1.1
5662
# via
5763
# -r requirements.in/base.txt
58-
# aioredis
5964
# pydantic
6065
uvicorn[standard]==0.17.6
6166
# via -r requirements.in/base.txt
@@ -65,3 +70,5 @@ watchgod==0.8.1
6570
# via uvicorn
6671
websockets==10.2
6772
# via uvicorn
73+
wrapt==1.14.1
74+
# via deprecated

0 commit comments

Comments
 (0)