Python 对已打开的django通道使用者的API请求

Python 对已打开的django通道使用者的API请求,python,django,websocket,django-rest-framework,django-channels,Python,Django,Websocket,Django Rest Framework,Django Channels,我有一个django频道的消费者正在与客户沟通。我从一个外部API获得了一个视图,它希望从客户端获得一些东西。从这个角度来看,我想告诉消费者通过他的套接字向客户机请求一个请求 我目前正在探索django rest框架,但目前还找不到直接向该消费者询问任何问题的方法。 我有一个想法,但它涉及到创建另一个套接字并通过通道的通道进行通信。但我希望我能摆脱这种负担。从您在评论中的回复来看,您似乎希望通过消费者从DRF视图向客户发送消息。你可以查看一个问题的答案 首先,您需要在您的消费者中有一个将消息发送

我有一个django频道的消费者正在与客户沟通。我从一个外部API获得了一个视图,它希望从客户端获得一些东西。从这个角度来看,我想告诉消费者通过他的套接字向客户机请求一个请求

我目前正在探索django rest框架,但目前还找不到直接向该消费者询问任何问题的方法。
我有一个想法,但它涉及到创建另一个套接字并通过通道的通道进行通信。但我希望我能摆脱这种负担。

从您在评论中的回复来看,您似乎希望通过消费者从DRF视图向客户发送消息。你可以查看一个问题的答案

首先,您需要在您的消费者中有一个将消息发送回客户端的方法:

...
async def send_alert(self, event):

    # Send message to WebSocket
    await self.send(text_data={
        'type': 'alert',
        'details': 'An external API api.external.com needs some data from you'
    })
...
因此,现在您可以向该方法发送消息。假设客户端连接到
通道1
,则可以在视图中执行此操作:

from channels.layers import get_channel_layer
from asgiref.sync import async_to_sync
...

channel_layer = get_channel_layer()
async_to_sync(channel_layer.send)("channel1", {
    "type": "send.alert"
})
...

我不能完全确定我是否理解你的问题。你能再详细一点吗?你的意思是你想从DRF视图向消费者发送消息吗?是的,我想从DRF视图向现有消费者发送消息这很难理解:)我将在下面发布答案。这也有助于显示您的消费者代码。消费者代码中没有任何特殊内容。接收和连接方法。稍后我将添加精度。如果您已经理解,谢谢您:)很抱歉,我忘了问我应该如何将从客户端得到的响应发送回API视图?我应该更新问题并撤销接受吗?这是一个单独的问题,因此您最好发布一个新问题,因为您的原始问题已经得到了回答,而且我认为从消费者向视图发送消息没有任何用处。这就像将数据从一个视图发送到另一个视图,没有任何意义。如果要从使用者调用任何逻辑,请将其与视图分开,以便视图和使用者都可以访问它。视图应该只处理请求/响应周期需要通过使用者向客户端发送内容的视图是一个带有django rest框架的RestAPI(希望如此)。因此,API不能通过使用者使用的打开的套接字直接发送任何内容。这两个视图来自项目中的两个不同逻辑部分。也许我不应该这样做,直接在消费者中处理,但我不知道如何处理。也许你应该用你的代码发布一个问题,为什么你需要从代码的另一部分调用视图,因为我仍然觉得很难想出一个必要的情况。如果它们被分成微服务,那么您可以从使用者(不一定直接从使用者)向第二个服务的端点发出http请求。