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. 人工水母搜索算法—matlab代码

    clc clear foj = @ Sphere; Lb = -100; % 搜索空间下界 Ub = 100; % 搜索空间上界 N_iter = 1000; % 最大迭代次数 n_pop = 50; ...

  2. 2. Go中defer使用注意事项

    1. 简介 defer 会在当前函数返回前执行传入的函数,它会经常被用于关闭文件描述符.关闭数据库连接以及解锁资源. 理解这句话主要在三个方面: 当前函数 返回前执行,当然函数可能没有返回值 传入的函 ...

  3. 小迪安全 Web安全 基础入门 - 第二天 - Web应用&架构搭建&漏洞&HTTP数据包&代理服务器

    一.网站搭建 1.域名.是由一串用点分隔的字符组成的互联网上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位.域名可以说是一个IP地址的代称,目的是为了便于记忆后者. 2.子域名.在 ...

  4. Spring 5| 轻量级的开源JavaEE框架

    一.Spring框架的概述 1.Spring是轻量级的开源的JavaEE框架 2.Spring可以解决企业应用开发的复杂性 3.Spring有两个核心的部分:IOC(控制反转)和AOP(面向切面编程) ...

  5. Java网络多线程编程:对象流错误导致Connection reset

    Java网络多线程编程--对象流错误导致Connection reset 在老韩的网络多线程编程实战项目中,发生了如下报错: 服务器端和客户端均发生了报错,在确定相应对象流代码完全没有问题之后,回归定 ...

  6. CF688B Lovely Palindromes 题解

    Content 输入一个数 \(n\),输出第 \(n\) 个偶数位回文数. 数据范围:\(1\leqslant n\leqslant 10^{10^5}\). Solution 一看这吓人的数据范围 ...

  7. java 图形化工具Swing 基本使用

    Swing介绍: 使用Swing开发图形界面比AWT更加优秀,因为Swing是一种轻量级组件,它采用100% Java实现,不再依赖于本地平台的图形界面,所以可以在所有平台上保持相同的运行效果,对跨平 ...

  8. uniapp+nvue实现仿微信/得物相册插件:选择界面 +自定义相册+图片视频过滤

    本篇文章基于uniapp 框架+ nvue,实现了uniapp仿微信/得物相册选择功能实例项目,该插件实例实现了以下功能: 1: 相册过滤 2: 图视频过滤 3: 界面UI定制化 4: 栅格列数定制化 ...

  9. c++11之find 和 find_if 和 find_if_not 用法

    时刻提醒自己 Note: vector的释放 0.头文件 #include <algorithm> 1.区别 返回范围 [first, last) 中满足特定判别标准的首个元素: 函数 功 ...

  10. 【LeetCode】5685. 交替合并字符串 Merge Strings Alternately (Python)

    作者: 负雪明烛 id: fuxuemingzhu 公众号:每日算法题 本文关键词:LeetCode,力扣,算法,算法题,交替合并字符串,Merge Strings Alternately,刷题群 目 ...