Serializer 用于获取复杂的 python 模型并将它们转换为 json。序列化程序还可用于在验证传入数据后将 json 反序列化回 Python 模型。

Sentry,我们有两种不同类型的序列化器 :Django Rest Framework SerializerModel Serializer

Django Rest Framework

Django Rest Framework 序列化程序用于处理进入 Sentry 的数据的输入验证和转换。

示例

在典型的 serializer 中,指定了字段,以便它们根据您的规范验证数据的类型和格式。

如果写入适合 modelDjango Rest Framework 序列化程序还可以将信息保存到数据库中。

from rest_framework import serializers
from sentry.api.serializers.rest_framework import ValidationError class ExampleSerializer(serializers.Serializer):
name = serializers.CharField()
age = serializers.IntegerField(required=False)
type = serializers.CharField() def validate_type(self, attrs, source):
type = attrs[source]
if type not in ['bear', 'rabbit', 'puppy']:
raise ValidationError('%s is not a valid type' % type)
return attrs

字段检查

在上面的示例中,

serializer 将接受并验证包含三个字段的 jsonnameagetype

其中 nametype 必须是strings

age 必须是建议的 integer

默认情况下,字段是必需的,如果不提供,serializer 将标记为无效。

请注意,integer 字段 age,required 设置为 False

因此可能不包括在内,serializer 仍将被视为有效。

自定义验证

对于需要自定义验证的值(除了简单的类型检查),

def validate_<variable_name>(self, attrs, source)

可以创建其中 <variable_name> 替换为给定字段的确切变量名称。

因此,例如,如果我有一个字段名称 typeName,验证方法名称将是 validate_typeName

而如果我有一个名为 type_name 的字段,验证方法名称将是 validate_type_name

在上面给出的示例中,类型被检查并且必须是某个字符串。

如果某个字段与您的验证方法所期望的不匹配,则会引发 ValidationError

用法

endpoint 中,这是 Django Rest Framework Serializer 的典型用法

class ExampleEndpoint(Endpoint):
def post(self, request):
serializer = ExampleSerializer(request.DATA)
if not serializer.is_valid():
return Response(serializer.errors, status=400) result = serializer.object #Assuming Example is a model with the same fields
try:
with transaction.atomic():
Example.objects.create(
name=result['name'],
age=result.get('age'),
type=result['type'],
)
except IntegrityError:
return Response('This example already exists', status=409) return Response(serialize(result, request.user), status=201)

验证数据

来自 Django Rest FrameworkSerializer 将用于需要验证的传入数据的方法(即 putpost 方法)。

一旦序列化器被实例化,你可以调用 serializer.is_valid() 来验证数据。

serializer.errors 将给出关于给定数据无效的具体反馈。

例如给定的输入

{
'age':5,
'type':'puppy'
}

serializer 将返回一个错误,指出未提供所需的字段名称。

保存数据

确认数据有效后,您可以通过以下两种方式之一保存数据。

上面给出的例子是 sentry 中最常见的。

serializer.object,它只是经过验证的数据(如果 serializer.is_valid() 返回 False,则为 None

并使用 <ModelName>.objects.create 将该数据直接保存在 model 中.

另一种方法使用了更多的 Django Rest Framework 的特性,

ModelSerializer

from rest_framework import serializers
from sentry.api.serializers.rest_framework import ValidationError class ExampleSerializer(serializer.ModelSerializer):
name = serializers.CharField()
age = serializers.IntegerField(required=False)
type = serializers.CharField() class Meta:
model = Example def validate_type(self, attrs, source):
type = attrs[source]
if type not in ['bear', 'rabbit', 'puppy']:
raise ValidationError('%s is not a valid type' % type)
return attrs class ExampleEndpoint(Endpoint):
def post(self, request):
serializer = ExampleSerializer(request.DATA)
if not serializer.is_valid():
return Response(serializer.errors, status=400) example = serializer.save()
return Response(serialize(example, request.user), status=201)

Model Serializer

Sentry's Model Serializers 仅用于传出数据。 典型的 model serializer 如下所示:

@register(Example)
class ExampleSerializer(Serializer):
def get_attrs(self, item_list, user):
attrs = {}
types = ExampleTypes.objects.filter(
type_name__in=[i.type for i in item_list]
) for item in item_list:
attrs[item] = {}
attrs[item]['type'] = [t for t in types if t.name == item.type_name]
return attrs def serialize(self, obj, attrs, user):
return {
'name':obj.name,
'type':attrs['type'],
'age': obj.age,
}

注册 Model Serializer

装饰器 @register 是必需的,以便

`return Response(serialize(example, request.user), status=201)`

works. 在这种情况下,它会在后台搜索匹配的模型 Example

给定变量 examplemodel 类型。

要将 model serializerModel 匹配,您只需执行

@register(<ModelName>)
class ModelSerializer(Serializer):
...

get_attrs 方法

Django Rest Framework 具有类似功能时,为什么要这样做?

get_attrs 方法就是原因。它允许您执行批量查询而不是多个查询。

在我们的示例中,我可以过滤我想要的 item,并使用 python 将它们分配给相关 item

而不是调用 ExampleTypes.objects.get(...) 多个 item

attr 字典的情况下,keyitem 本身。

并且 value 是一个字典,其中包含要添加的属性的名称及其值。

attrs[item] = {'attribute_name': attribute}

Serialize 方法

最后,您返回一个带有 json 可序列化信息的字典,该信息将与 response 一起返回。

更多

Sentry 开发者贡献指南 - Django Rest Framework(Serializers)的更多相关文章

  1. Sentry 开发者贡献指南 - 配置 PyCharm

    概述 如果您使用 PyCharm 进行开发,则需要配置一些内容才能运行和调试. 本文档描述了一些对 sentry 开发有用的配置 配置 Python 解释器:(确保它是 venv 解释器)例如 ~/v ...

  2. Sentry 开发者贡献指南 - 数据库迁移

    Django 迁移是我们处理 Sentry 中数据库更改的方式. Django 迁移官方文档:https://docs.djangoproject.com/en/2.2/topics/migratio ...

  3. Sentry 开发者贡献指南 - 后端服务(Python/Go/Rust/NodeJS)

    内容整理自官方开发文档 系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创建版本 快速使用 Docker 上手 Sentry-CLI - 30 秒上手 Source Map ...

  4. Sentry 开发者贡献指南 - SDK 开发(性能监控)

    内容整理于官方开发文档 系列 Docker Compose 部署与故障排除详解 K8S + Helm 一键微服务部署 Sentry 开发者贡献指南 - 前端(ReactJS生态) Sentry 开发者 ...

  5. Sentry 开发者贡献指南 - SDK 开发(事件负载)

    内容整理自官方开发文档 系列 Docker Compose 部署与故障排除详解 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创建版本 快速使用 Docker 上手 Sentr ...

  6. Sentry 开发者贡献指南 - Feature Flag

    功能 flag 在 Sentry 的代码库中声明. 对于自托管用户,这些标志然后通过 sentry.conf.py 进行配置. 对于 Sentry 的 SaaS 部署,Flagr 用于在生产中配置标志 ...

  7. Sentry 开发者贡献指南 - 前端 React Hooks 与虫洞状态管理模式

    系列 Sentry 开发者贡献指南 - 前端(ReactJS生态) Sentry 开发者贡献指南 - 后端服务(Python/Go/Rust/NodeJS) 什么是虫洞状态管理模式? 您可以逃脱的最小 ...

  8. Sentry 开发者贡献指南 - SDK 开发(性能监控:Sentry SDK API 演进)

    内容整理自官方开发文档 本文档的目标是将 Sentry SDK 中性能监控功能的演变置于上下文中. 我们首先总结了如何将性能监控添加到 Sentry 和 SDK, 然后我们讨论 identified ...

  9. Sentry 开发者贡献指南 - 测试技巧

    作为 CI 流程的一部分,我们在 Sentry 运行了多种测试. 本节旨在记录一些 sentry 特定的帮助程序, 并提供有关在构建新功能时应考虑包括哪些类型的测试的指南. 获取设置 验收和 pyth ...

随机推荐

  1. JeeSite Spring Cloud安装搭建

    引言 JeeSite Cloud 具备 JeeSite 4.x 的所有功能,是在 JeeSite 4.x 基础之上,完成的 Spring Cloud 分布式系统套件的整合.它利用 JeeSite 4. ...

  2. CF749A Bachgold Problem 题解

    Content 给定一个数 \(n\),求它最多能够拆分成多少个质数,并输出拆分成的每一个质数. 数据范围:\(2\leqslant n\leqslant 10^5\). Solution 我们考虑尽 ...

  3. python开发环境软件包安装相关 failed with error code 1 in /tmp/pip-build-vn_f_e1n/psutil/

    指定源安装 pip install git+https://github.com/xxxxxx.git pip install -r requirements.txt -i https://mirro ...

  4. ssh框架从页面传中文发生乱码时怎么解决,就是添加一个字符编码拦截器。用springframework自带的便可

    ssh框架从页面传中文发生乱码时怎么解决,就是添加一个字符编码拦截器.用springframework自带的便可

  5. 用jQuery实现数字滚动效果

    html 部分 <div class="js-box box"></div> css 部分 .statistic .box{ display: inline ...

  6. RPA账户和密码管理方案

    如何将登录业务系统的账户和密码"更好的,更合适"地交给RPA? 相信很多小伙伴们在做RPA的时候, 都会或多或少的遇到类似的问题. 正常情况下IT管理人员都会给真实的业务人员分配业 ...

  7. 『与善仁』Appium基础 — 26、常用手机操作的API说明

    目录 1.获取当前手机的时间 2.获取手机屏幕的宽和高 3.获取手机当前网络 4.设置手机网络模式 5.操作手机通知栏 6.综合练习 7.发送键到设备(掌握) 8.手机截图(掌握) 是针对手机一些常用 ...

  8. C库函数将字符串转大小写

    头文件 #include <algorithm> transform 函数 转大写 std::string str_write; // 全部转为大写 std::transform(str_ ...

  9. Qt5读取系统环境变量和获取指定目录下的所有文件夹绝对路径

    头文件 /// 读取环境变量使用 #include <QProcessEnvironment> /// 遍历文件夹使用 #include <QDir> 核心代码 一个例子, 输 ...

  10. 【九度OJ】题目1474:矩阵幂 解题报告

    [九度OJ]题目1474:矩阵幂 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1474 题目描述: 给定一个n*n的矩阵,求该矩阵的 ...