0

In my existing djangorest api I want to publish a message in a Redis channel from side the python code. I want to do it asynchronously i.e, want to call an async function which will send a message to the channel and at the same time my api should response the user instead blocking at that redis communication.

Lets see example.

Below code is working well

#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
    )


But I don't want to wait for redis connection and publishing the message rather want to do it asynchronously like below


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 Answer 1

1

You can't await connection and redis, because they're not corutines. It will looks like:

 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')
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.