问题描述
在我现有的djangorest api中,我想从Python代码的一侧在Redis通道中发布一条消息。我想异步执行该操作,即要调用一个异步函数,该函数会将消息发送到通道,同时我的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"),db=config("REdis_SERVER_DB"))
await connection.publish('channel','my pubsub message')
return "Nice"
#Python function (api function)
def create(self,**kwargs):
queryset = Order.objects.all()
serializer_class = OrderSerializer
#some business logic
publish_message('my_channel',status=status.HTTP_201_CREATED
)
解决方法
您不能等待连接和Redis,因为它们不是Corutines。它看起来像:
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')