使用django通道的websockets的restful api。

djangochannelsrestframework的Python项目详细描述


django channels rest框架为构建channels-v2 websocket消费者提供了一个类似drf的接口。

这个项目可以与HyperMediaChannelsChannelsMultiplexer一起使用,在websockets上创建一个超媒体风格的api。然而,django channels rest框架也是一个独立的框架,其目标是提供drf用户熟悉的api。

https://travis-ci.org/hishnash/djangochannelsrestframework.svg?branch=master

感谢

dcrf基于Channels Api的叉,当然灵感来自Django Rest Framework

安装

pip install djangochannelsrestframework

如何使用

观察模型实例

接受实例订阅的使用者。

classTestConsumer(ObserverModelInstanceMixin,GenericAsyncAPIConsumer):queryset=get_user_model().objects.all()serializer_class=UserSerializer

这将向该实例公开retrievesubscribe_instance操作。

订阅发送:

{"action":"subscribe_instance","pk":42,# the id of the instance you are subscribing to"request_id":4# this id will be used for all resultent updates.}

操作将从服务器发送出去:

{"action":"update","errors":[],"response_status":200,"request_id":4,"data":{'email':'42@example.com','id':42,'username':'thenewname'},}

添加自定义操作

classUserConsumer(GenericAsyncAPIConsumer):queryset=get_user_model().objects.all()serializer_class=UserSerializer@action()asyncdefsend_email(self,pk=None,to=None,**kwargs):user=awaitdatabase_sync_to_async(self.get_object)(pk=pk)# ... do some stuff# remember to wrap all db actions in `database_sync_to_async`return{},200# return the contenct and the response code.@action()# if the method is not async it is already wrapped in `database_sync_to_async`defpublish(self,pk=None,**kwargs):user=self.get_object(pk=pk)# ...return{'pk':pk},200

您也可以使用以下任一选项:

  • CreateModelMixin
  • ListModelMixin
  • RetrieveModelMixin
  • UpdateModelMixin
  • PatchModelMixin
  • DeleteModelMixin

就像你在drf里一样。

fromdjangochannelsrestframework.genericsimportGenericAsyncAPIConsumerfromdjangochannelsrestframework.mixinsimport(RetrieveModelMixin,UpdateModelMixin)classUserConsumer(RetrieveModelMixin,UpdateModelMixin,GenericAsyncAPIConsumer):queryset=get_user_model().objects.all()serializer_class=UserSerializer

不受车型约束的消费者

您还可以创建与任何模型都不相关的消费者。

fromdjangochannelsrestframework.decoratorsimportactionfromdjangochannelsrestframework.consumersimportAsyncAPIConsumerclassMyConsumer(AsyncAPIConsumer):@action()asyncdefan_async_action(self,some=None,**kwargs):# do something asyncreturn{'response with':'some message'},200@action()defa_sync_action(self,pk=None,**kwargs):# do something syncreturn{'response with':'some message'},200

在WebSocket连接上使用普通视图

fromdjangochannelsrestframework.consumersimportview_as_consumerapplication=ProtocolTypeRouter({"websocket":AuthMiddlewareStack(URLRouter([url(r"^front(end)/$",view_as_consumer(YourDjangoView)),])),})

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
在Java中超类的构造函数中获取扩展泛型类的泛型类型?   java如何获取实体A的不同记录,该实体A与另一个实体B有一对多的关联,并按B记录的最新时间戳的最大值排序   JavaJSF导航参数依赖关系   具有短密文的java SecretKey匿名IBE   鼠标事件“找不到符号”错误的java解决方案   调用mediaplayer后使用java。停止我不能再发出声音了。为我解释开发参考?   java如何在序列化Avro消息时传递空值   java Sip Servlet未发送邀请请求   java根据规则访问节点,并删除链表中所有未访问的节点   Java 6上的jmockit测试用例必须使用Java代理吗?   JSF转换器f:convertDateTime是如何工作的?   java如何清除Firebase云数据库中的数组?   基于日期的列表java自定义排序   测量Java对象的内存消耗(完全“在应用程序中”)   故障终止/崩溃时的javafx Java(FX)故障保护警报?   java访问名称编码未知的文件   java如何在BlackBerry中绘制实心正方形?   java从JTextArea中删除边框   java可以使用另一个bean的属性来引用spring容器XML配置   数据透视表中具有相同列索引的java计数列