超媒体频道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中两个链表之间的子集   java仅在findViewById()下显示一个ImageButton   在Java Graphics2D中,文本如何在矩形上居中对齐?   java需要一个用于电子表格计算器的正则表达式   ^java中的运算符   java通过一些属性配置文件根据环境动态更改wsdl端点URL   java Ebean/Play框架关系未更新   集合如何将POJO列表转换为Java流中的映射<String,List>?   java为什么JFrame不显示整个图像?   java如何将调用静态导入的泛型方法的结果传递给另一个方法?   迭代器或foreach中的java延迟   需要java socket logback日志接收器   在Java中初始化Map的静态数组   雅加达邮件Java MimeMail:解码后获得额外字符   java为什么这个xmldom解析器不能正确解析rtept、name和cmt标记?   java如何刷新Log4J2中的异步记录器(带中断器)   java使用构建插件pom生成的jar。xml作为同一pom中的依赖项   java基于位置的序列ADT如何在O(1)时间内插入元素?   java ORM实体与DDD实体   Java对象分配