超媒体频道rest框架。

hypermediachannels的Python项目详细描述


用于DjangoChannelsRestFramework的超媒体样式序列化程序。

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

API使用

这是serialiser和serialiser字段的集合,它们创建 像pk这样的超级美的风格

设置消费者

所有用户都应该通过异步WebSocketDemultipler映射。

fromchannelsmultiplexerimportAsyncJsonWebsocketDemultiplexerfromdjangochannelsrestframework.genericsimportGenericAsyncAPIConsumerfromhypermediachannels.serializersimportHyperChannelsApiModelSerializerclassUserSerializer(HyperChannelsApiModelSerializer):classMeta:model=Userfields=('@id','username')classUserConsumer(GenericAsyncAPIConsumer):queryset=User.objects.all()serializer_class=UserSerializerclassMainDemultiplexer(AsyncJsonWebsocketDemultiplexer):applications={'users':UserConsumer,}

然后在配置channels应用程序时,添加MainDemultiplexer作为您的主要使用者。这样,该url上的所有websocket连接都将通过Demultiplexer运行。有关如何编写使用者的详细说明,请参见DjangoChannelsRestFramework

超通道sApimodelSerializer

这可以用来代替drfModelSerializer。会的(如果你 在fields列表中包含@id添加对 正在显示的型号)

例如User如果其字段是 ('@id', 'username', 'profile')

{@id:{stream:'user',payload:{action:'retrieve',pk:1023}},username:'bob@example.com',profile:{stream:'profile',payload:{action:'retrieve',pk:23}}}

这将在hood下使用HyperlinkedIdentityField创建 @idprofile字段,它们(默认情况下)将返回这些 retrieve对象。

为什么要这样做。

这意味着如果我们需要为此用户查找profile。 我们可以发送消息:

{stream:'profile',payload:{action:'retrieve',pk:23}}

在websocket上,我们会得到那个项目,前端代码没有 需要跟踪所有这些锁定逻辑(考虑一些模型 例如,可能有不基于pk的查找。

如果需要定义不同的查找参数集。你可以使用 kwarg_mappingsstream_nameaction_nameKwargs到 覆盖这个。

例如:

classUserSerializer(HyperChannelsApiModelSerializer):classMeta:model=get_user_model()fields=('@id','username','profile')extra_kwargs={'profile':{'action_name':'user_profile','kwarg_mappings':{'user_pk':'self.pk','team_pk':'team.pk'}},}

kwarg_mappings将通过以下方式设置响应user_pk中的值 正在从User实例中提取上的pk值。

(将self预附加到kwarg_mappings值意味着它将执行 基于解析到父级的实例的查找Serializer 而不是这个字段的实例。在本例中是用户配置文件)。

所以上面的内容会返回:

{@id:{stream:'user',payload:{action:'retrieve',pk:1023}},username:'bob@example.com',profile:{stream:'user_profile',payload:{action:'retrieve',user_pk:1023,team_pk:234234}}}

您可以使用.访问嵌套值,例如profile.team.name

或者,您可以像在drf中一样创建字段。
classUserSerializer(HyperChannelsApiModelSerializer):team=HyperChannelsApiRelationField(source='profile.team',kwarg_mappings={'member_username':'self.username'})classMeta:model=get_user_model()fields=('@id','username','team')

这将返回:

{@id:{stream:'user',payload:{action:'retrieve',pk:1023}},username:'bob@example.com',team:{stream:'team',payload:{action:'retrieve',member_username:'bob@example.com'}}}

如果引用多个字段,则HyperChannelsApiModelSerializer 会变魔术的:

classUserSerializer(HyperChannelsApiModelSerializer):friends=HyperChannelsApiRelationField(source='profile.friends')classMeta:model=get_user_model()fields=('@id','username','friends')extra_kwargs={'friends':{'kwarg_mappings':{'user_pk':'self.user.pk',}},}

为任何Many字段添加extra_kwargs可能很重要,以便 您可以控制使用的查找参数。

注意所有Many字段(向前和向后)都将提取 来自父实例的值,而不管是否在 kwarg_mappings值。)

这将返回:

{@id:{stream:'user',payload:{action:'retrieve',pk:1023}},username:'bob@example.com',friends:{stream:'user_profile',payload:{action:'list',user_pk:1023}}}

记住,如果 需要,例如:

extra_kwargs={'@id':{'action_name':'subscribe_status','kwarg_mappings':{'username':'username'}},}

返回许多项目。

期望得到:

[{stream:'user',payload:{action:'retrieve',pk:1023}},{stream:'user',payload:{action:'retrieve',pk:234}},{stream:'user',payload:{action:'retrieve',pk:103223}},]

而不是为每个实例获取一个完全扩展的值 更确切地说,只需获得一个可以用来查找的hyper media paths列表 你需要的实例。

如果需要重写streamactionlookup,请执行以下操作:

classUserSerializer(HyperChannelsApiModelSerializer):classMeta:model=Userfields=('@id','username')many_stream_name='active_users'many_kwarg_mappings={'username':'username'}many_action_name='subscribe'

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

推荐PyPI第三方库


热门话题
java使用servlet的正确方法是什么?   java Android ListView选中所有复选框(自定义ResourceCursorAdapter)   java如何在一个活动中正确处理多个片段交互侦听器?   java jUnit和忽略继承的测试   具有多个权限的java ActivityResultLauncher   Java:我可以通过应用程序将客户端重定向到loadbalancer后面的同一个会话/节点吗?   java如何使用Hibernate保存具有一对一关系的两个类?   java JEditorPane字体大小设置不准确   java为什么JUnit4导入不被识别,即使JUnit4在我的有效pom中。xml?   多次使用流后的java空映射   JavaSwing中AccessibleContext的用途是什么?   java指定使用T的类   java查找twitter4j转发速率限制   枚举的Java数组(类)   java通过Maven build排除了一些类