django rest framework(drf)序列化程序加速

drf-serializer-cache的Python项目详细描述


django rest framework序列化程序加速

PyPI versionBuild StatusCoverage Status

DRF序列化程序的简单短生命缓存实现。 它解决了drf序列化程序的两个问题:

  • Serializer.fields属性在某些情况下可能非常慢。 这种情况包括复杂的ModelSerializer,序列化器层次结构 使用重复序列化程序和递归序列化程序。 fields在每个序列化运行的类中缓存并计算一次。 这导致限制-fields不应动态调整 序列化程序内部,继承自SerializerCacheMixin
  • 默认情况下,如果 它们两次遇到具有相同序列化程序的同一对象。这个可以转动 如果多个对象包含同一个很难序列化的依赖项 物体。缓存避免在遇到实例表示时重新计算实例表示 多次出现相同的实例。

性能结果

Performance results

缓存生存期和失效

cache设计简单,不易出错。 当顶级序列化程序to_representation启动时创建缓存 一旦这个方法完成就被清除。因此没有必要 对于超时或复杂的缓存失效。之间没有共享数据 请求。 因此,以下情况可以正常工作:

user=User.objects.get(name='Lee')data_1=UserSerializer(user).data# OrderedDict([('name', 'Lee')])user.name='Bob'user.save()data_2=UserSerializer(user).data# OrderedDict([('name', 'Bob')])

用法

用法应该很简单-在 继承自SerializerModelSerializer

fromdrf_serializer_cacheimportSerializerCacheMixinfromrest_frameworkimportserializersclassUserSerializer(SerializerCacheMixin,serializers.ModelSerializer):classMeta:model=Userfields=('id','name')

常见陷阱

缓存清理太频繁

缓存位于序列化程序层次结构根目录中,但定义了它的生存期 通过最近的树节点,它继承自SerializerCacheMixin。 理想的情况是根继承自SerializerCacheMixin。 这就是为什么SerializerCacheMixin使用自定义list_serializer_class, 它也继承自SerializerCacheMixin。 如果使用自定义列表作为序列化程序层次结构的根-建议 使用SerializerCacheMixin作为基类。

层次结构太多

默认情况下,序列化程序通过在它们的 子序列化程序。这个案子可以破serializers.SerializerMethodField 如果它使用某种序列化程序而不调用其上的bind

fromdrf_serializer_cacheimportSerializerCacheMixinfromrest_frameworkimportserializersclassResultSerializer(SerializerCacheMixin,serializers.Serializer):results=serializers.SerializerMethodField()defget_results(self,instance):# recursive serializerserializer=self.__class__(instance.results,many=True)serializer.bind('*',self)# bind call is essential for efficient cache !returnserializer.data

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

推荐PyPI第三方库


热门话题
java对多个for循环使用一个整数有什么好处?   要求的Java枚举错误返回类型   使用AOP的Java Spring MVC CSRF令牌   PHP ZF2中的java 安卓登录按钮和远程web登录   java将双精度转换为整数转换为字符串,并在TxtField CodeNameOne中输出   java代码不断向后向数组中输入值   如何使用Java获取git信息?   当使用DateUtils类的parseDateStructive()方法时,java异常无法解析日期   java执行示例Flink kafka consummer   java触发REST调用时无法解释某些汉字   java错误:不兼容的类型:<null>如果使用安卓 room(!\u cursor.isNull(null))则无法转换为int   java Spring引导构建正常,但Heroku部署失败   我无法使用ORMLite库在java(安卓)中执行“WITH RECURSIVE”子句   java JavaFX图像加载错误