为django rest framework和pusher提供易于使用的类混合,以保持api的实时性。
drf-model-pusher的Python项目详细描述
DRF型号推进器
易于使用类混合,用于Django Rest Framework和Pusher,以保持API的实时性。
安装
从pypi下载:
pip install drf_model_pusher
配置
设置配置
在您的设置中,设置推进器应用程序ID和凭据,群集是可选的
PUSHER_APP_ID=""PUSHER_KEY=""PUSHER_SECRET=""PUSHER_CLUSTER=""
更新已安装的应用程序
将drf_model_pusher添加到您的INSTALLED_APPS
:
INSTALLED_APPS=["...","drf_model_pusher",]
执行推进器后端
在pusher_backends.py
文件中为模型和序列化程序定义一些PusherBackends。pusherbackend类只需要定义一个继承自ModelSerializer
的serializer_class
属性。
# example/pusher_backends.pyfromdjango.db.modelsimportModelfromrest_framework.serializersimportModelSerializerfromdrf_model_pusher.backendsimportPusherBackend,PrivatePusherBackendclassMyModel(Model):passclassMyModelSerializer(ModelSerializer):classMeta:model=MyModelclassMyModelPrivateSerializer(ModelSerializer):classMeta:model=MyModelclassMyModelPusherBackend(PusherBackend):serializer_class=MyModelSerializerclassMyModelPrivatePusherBackend(PrivatePusherBackend):serializer_class=MyModelPrivateSerializer
实施视图
将^ {A6} MIXIN类添加到视图中,并定义一个^ {< CD6>}方法,该方法应返回用作通道的字符串列表。
# example/views.pyfromrest_framework.viewsetsimportModelViewSetfromdrf_model_pusher.viewsimportModelPusherViewMixinfromexample.serializersimportMyModelSerializerclassMyModelViewSet(ModelPusherViewMixin,ModelViewSet):serializer_class=MyModelSerializerdefget_pusher_channels(self):return["<channel_id>"]
忽略当前连接
如果要在发送消息时忽略当前连接,则应在请求中设置一个x-pusher-socket-id
头。如果您正在修改资源并在响应中接收结果,这可能很有用,您可能不希望当前连接侦听这些事件以防止复制内容。
pusherbackend.push_change方法接受一个ignore
布尔关键字参数,该参数可以切换是否使用pusher socket id,它默认为True
,因此在请求中包含pusher socket id将忽略默认发送的所有pusher事件的当前连接。
设置
DRF_MODEL_PUSHER_BACKENDS_FILE
(默认值:pusher_backends.py
)-应用程序中导入pusherbackend的文件。DRF_MODEL_PUSHER_DISABLED
(默认值:False
)-确定是否触发pusher事件。
常见问题
未注册的后端
如果您正确地执行了上述步骤,并且后端没有注册,那么您的应用程序配置可能没有运行它的ready
方法。要强制执行此操作,请在应用程序中添加行__init__.py
。
推进器
注意任何pusher限制,并查阅https://pusher.com/docs上的文档以了解一些常见问题。
延伸PusherBackend
如果要扩展PusherBackend
或PrivatePusherBackend
,而不是声明新的具体后端,则需要确保类是抽象的。例如,您的新基类将类似于此:
classMyPusherBackend(PusherBackend):classMeta:abstract=True# Override whatever methods hereclassMyModelBackend(MyPusherBackend):classMeta:model=MyModel