#python #django-rest-framework #redis #python-asyncio
#python #django-rest-framework #redis #python-asyncio
Вопрос:
В моем существующем API djangorest я хочу опубликовать сообщение в канале Redis со стороны кода python. Я хочу сделать это асинхронно, т. Е. Хочу вызвать асинхронную функцию, которая отправит сообщение на канал, и в то же время мой API должен отвечать пользователю, а не блокировать это сообщение redis.
Давайте посмотрим пример.
Приведенный ниже код работает хорошо
#Python function (api function)
def create(self, request, *args, **kwargs):
queryset = Order.objects.all()
serializer_class = OrderSerializer
#some business logic
connection = redis.Redis(host=config("REDIS_SERVER_URL"), port=config("REDIS_SERVER_PORT"), db=config("REDIS_SERVER_DB"))
connection.publish('my_channel', 'my pubsub message')
return Response(
data={
'status': True,
'message': "Order Successfully Created",
'data': response
},
status=status.HTTP_201_CREATED
)
Но я не хочу ждать подключения redis и публикации сообщения, а хочу сделать это асинхронно, как показано ниже
async def publish_message(channel, message):
connection = await redis.Redis(host=config("REDIS_SERVER_URL"), port=config("REDIS_SERVER_PORT"), db=config("REDIS_SERVER_DB"))
await connection.publish('channel', 'my pubsub message')
return "Nice"
#Python function (api function)
def create(self, request, *args, **kwargs):
queryset = Order.objects.all()
serializer_class = OrderSerializer
#some business logic
publish_message('my_channel', 'my pubsub message')
return Response(
data={
'status': True,
'message': "Order Successfully Created",
'data': response
},
status=status.HTTP_201_CREATED
)
Ответ №1:
Вы не можете ожидать подключения и redis, потому что они не являются корутинами. Это будет выглядеть так:
async def publish_message(channel, message):
connection = redis.Redis(host=config("REDIS_SERVER_URL"), port=config("REDIS_SERVER_PORT"), db=config("REDIS_SERVER_DB"))
connection.publish('channel', 'my pubsub message')
return "Nice"
def it_works():
await publish_message('gg', 'wp')