混合Websockets和REST

时间:2017-02-03 06:13:16

标签: django websocket django-rest-framework django-channels

我正在编写RESTfull api,例如用户可以在线程中创建新线程或新帖子。这是我使用普通POST请求的地方。我的API还允许用户相互发送消息。当用户收到我希望在浏览器中通知的消息时,我会使用websockets而不是每隔几秒轮询一次。

我的问题是

  • 由于我已经与websocket打开了连接消息,我是否也应该使用此连接发送消息,创建新线程或帖子?

  • 我是否可以使用POST请求创建消息和websockets以实时接收它们以及GET请求以获取消息历史记录?这是一个好习惯吗?

  • 我正在使用django rest框架,它为我处理字段验证,如果我使用websocket创建资源而不是普通的POST请求,我将如何处理验证。

我在开发RESTfull API方面非常新,我只开始使用websockets进行开发。对不起任何对你来说似乎合乎逻辑的愚蠢的任务:)

由于

2 个答案:

答案 0 :(得分:0)

  

因为我已经与websocket打开了连接消息   将来,我是否也应该使用此连接发送消息,创建   新帖子或帖子?

这取决于。如果您使用的是CQRS方法,并且您的写入由不同于读取的框处理,则您希望使用常规HTTP POST;或者如果必须为可能不支持WebSockets的外部调用者提供兼容性。

  

我可以使用POST请求创建要接收的消息和websockets   他们实时和GET请求获取消息的历史?这是   好的做法?

听起来很合理。您将获得REST兼容性和WebSocket作为增强功能。我所做的是使用WebSockets来增强REST API。有些操作分为两部分,例如" autocompletes"本质上是快速连续的调用并且属于读取模型可以通过两种方式完成,但是缺点是我无法利用内置输出缓存,我必须为它们实现自己的缓存。

  

我正在使用django rest框架,它处理字段的验证   对我来说,如果我使用创建资源,我将如何处理验证   websocket而不是普通的POST请求。

我不做django,但我猜你自己可以以某种方式挂钩验证,并在反序列化后在你的消息对象中调用它。

答案 1 :(得分:0)

关于第3个问题,最基本的解决方案看起来像

def ws_create_item(message):
    data = json.loads(message['text'])
    serializer = ItemSerializer(data=data)
    if serializer.is_valid():
        serializer.save()

ItemSerializer只是您常用的DRF序列化程序,ws_create_item是接收WebSocket消费者。