超媒体频道rest框架。
hypermediachannels的Python项目详细描述
用于DjangoChannelsRestFramework的超媒体样式序列化程序。
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创建 @id和profile字段,它们(默认情况下)将返回这些 retrieve对象。
为什么要这样做。
这意味着如果我们需要为此用户查找profile。 我们可以发送消息:
{stream:'profile',payload:{action:'retrieve',pk:23}}
在websocket上,我们会得到那个项目,前端代码没有 需要跟踪所有这些锁定逻辑(考虑一些模型 例如,可能有不基于pk的查找。
如果需要定义不同的查找参数集。你可以使用 kwarg_mappings,stream_name和action_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列表 你需要的实例。
如果需要重写streamaction或lookup,请执行以下操作:
classUserSerializer(HyperChannelsApiModelSerializer):classMeta:model=Userfields=('@id','username')many_stream_name='active_users'many_kwarg_mappings={'username':'username'}many_action_name='subscribe'