Sentry 开发者贡献指南 - Django Rest Framework(Serializers)

Serializer 用于获取复杂的 python 模型并将它们转换为 json。序列化程序还可用于在验证传入数据后将 json 反序列化回 Python 模型。
在 Sentry,我们有两种不同类型的序列化器 :Django Rest Framework Serializer 和 Model Serializer。
Django Rest Framework
Django Rest Framework 序列化程序用于处理进入 Sentry 的数据的输入验证和转换。
示例
在典型的 serializer 中,指定了字段,以便它们根据您的规范验证数据的类型和格式。
如果写入适合 model,Django 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 将接受并验证包含三个字段的 json:name、age 和 type。
其中 name 和 type 必须是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 Framework 的 Serializer 将用于需要验证的传入数据的方法(即 put 和 post 方法)。
一旦序列化器被实例化,你可以调用 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,
给定变量 example 的 model 类型。
要将 model serializer 与 Model 匹配,您只需执行
@register(<ModelName>)
class ModelSerializer(Serializer):
...
get_attrs 方法
当 Django Rest Framework 具有类似功能时,为什么要这样做?
get_attrs 方法就是原因。它允许您执行批量查询而不是多个查询。
在我们的示例中,我可以过滤我想要的 item,并使用 python 将它们分配给相关 item,
而不是调用 ExampleTypes.objects.get(...) 多个 item。
在 attr 字典的情况下,key 是 item 本身。
并且 value 是一个字典,其中包含要添加的属性的名称及其值。
attrs[item] = {'attribute_name': attribute}
Serialize 方法
最后,您返回一个带有 json 可序列化信息的字典,该信息将与 response 一起返回。
更多
- Sentry 企业级数据安全解决方案 - Relay 入门
- Sentry 企业级数据安全解决方案 - Relay 运行模式
- Sentry 企业级数据安全解决方案 - Relay 配置选项
- Sentry 企业级数据安全解决方案 - Relay 监控 & 指标收集
- Sentry 企业级数据安全解决方案 - Relay 项目配置
- Sentry 开发者贡献指南 - SDK 开发(性能监控:Sentry SDK API 演进)
Sentry 开发者贡献指南 - Django Rest Framework(Serializers)的更多相关文章
- Sentry 开发者贡献指南 - 配置 PyCharm
概述 如果您使用 PyCharm 进行开发,则需要配置一些内容才能运行和调试. 本文档描述了一些对 sentry 开发有用的配置 配置 Python 解释器:(确保它是 venv 解释器)例如 ~/v ...
- Sentry 开发者贡献指南 - 数据库迁移
Django 迁移是我们处理 Sentry 中数据库更改的方式. Django 迁移官方文档:https://docs.djangoproject.com/en/2.2/topics/migratio ...
- Sentry 开发者贡献指南 - 后端服务(Python/Go/Rust/NodeJS)
内容整理自官方开发文档 系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创建版本 快速使用 Docker 上手 Sentry-CLI - 30 秒上手 Source Map ...
- Sentry 开发者贡献指南 - SDK 开发(性能监控)
内容整理于官方开发文档 系列 Docker Compose 部署与故障排除详解 K8S + Helm 一键微服务部署 Sentry 开发者贡献指南 - 前端(ReactJS生态) Sentry 开发者 ...
- Sentry 开发者贡献指南 - SDK 开发(事件负载)
内容整理自官方开发文档 系列 Docker Compose 部署与故障排除详解 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创建版本 快速使用 Docker 上手 Sentr ...
- Sentry 开发者贡献指南 - Feature Flag
功能 flag 在 Sentry 的代码库中声明. 对于自托管用户,这些标志然后通过 sentry.conf.py 进行配置. 对于 Sentry 的 SaaS 部署,Flagr 用于在生产中配置标志 ...
- Sentry 开发者贡献指南 - 前端 React Hooks 与虫洞状态管理模式
系列 Sentry 开发者贡献指南 - 前端(ReactJS生态) Sentry 开发者贡献指南 - 后端服务(Python/Go/Rust/NodeJS) 什么是虫洞状态管理模式? 您可以逃脱的最小 ...
- Sentry 开发者贡献指南 - SDK 开发(性能监控:Sentry SDK API 演进)
内容整理自官方开发文档 本文档的目标是将 Sentry SDK 中性能监控功能的演变置于上下文中. 我们首先总结了如何将性能监控添加到 Sentry 和 SDK, 然后我们讨论 identified ...
- Sentry 开发者贡献指南 - 测试技巧
作为 CI 流程的一部分,我们在 Sentry 运行了多种测试. 本节旨在记录一些 sentry 特定的帮助程序, 并提供有关在构建新功能时应考虑包括哪些类型的测试的指南. 获取设置 验收和 pyth ...
随机推荐
- logcplus(2)
(一)log4cplus是C++编写的开源的日志系统,功能非常全面,用到自己开发的工程中会比较专业的,:),本文介绍了log4cplus基本概念,以及如何安装,配置. ### 简介 ### log4 ...
- Tornado WEB服务器框架 Epoll-- 【Mysql数据库】
5.1 数据库 与Django框架相比,Tornado没有自带ORM,对于数据库需要自己去适配.我们使用MySQL数据库. 在Tornado3.0版本以前提供tornado.database模块用来操 ...
- 网站高可用架构之BASE原理
BASE理论是eBay架构师提出的. BASE定理来源:是CAP中一致性和可用性的权衡结果,它来自大规模互联网分布式系统的总结,是基于CAP定理逐步演化而来的. BASE定理的核心思想:即使无法做到强 ...
- 使用.NET 6开发TodoList应用(5.1)——实现Repository模式
需求 经常写CRUD程序的小伙伴们可能都经历过定义很多Repository接口,分别做对应的实现,依赖注入并使用的场景.有的时候会发现,很多分散的XXXXRepository的逻辑都是基本一致的,于是 ...
- JAVA里List集合中的对象根据对象的某个属性值降序或者升序排序
需要使用JDK1.8及以上 package com.stream; import java.util.Comparator; import java.util.List; public class T ...
- Android NDK开发篇:Java与原生代码通信(数据操作)
虽然说使用NDK可以提高Android程序的执行效率,但是调用起来还是稍微有点麻烦.NDK可以直接使用Java的原生数据类型,而引用类型,因为Java的引用类型的实现在NDK被屏蔽了,所以在NDK使用 ...
- 【Android开发】微信精选,文章资讯类App开发记录总结
缘起 微信精选的App开发来源是在聚合数据上看到了有免费的微信精选的数据接口,无限调用.相对于其他的诸如违章查询,医药查询,NBA赛事等等,我感觉还是微信文章精选这个数据接口离我最近,所以想着拿着个数 ...
- 【LeetCode】572. 另一个树的子树 Subtree of Another Tree(Python & Java)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:先序遍历 方法二:DFS + DFS 方法三 ...
- 【LeetCode】881. Boats to Save People 解题报告(Python)
[LeetCode]881. Boats to Save People 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu ...
- Special Prime
Special Prime Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...