django - 使用 Django Rest Framework 时,我应该如何构造带有副作用的请求?

标签 django django-models django-rest-framework webhooks

我正在使用 Django Rest Framework,它与外部服务集成。每当在外部服务中创建新任务时,我都会使用端点从 webhook 接收回调。

当回调请求进来时,我的代码至少需要创建一个对象。但是可能需要从多个不同的模型创建多个对象。例如,如果创建了一个新任务,它可能是由新用户创建的,我还需要创建一个新用户对象来反射(reflect)这一点。

总共最多可以有 5 个额外的对象作为副作用。我知道可以添加此逻辑的多个不同位置(例如服务层、序列化程序、模型、管理器、 View )。但所有这些似乎都有问题。

以前有人处理过这个问题吗?如果是这样,你是如何解决的?

最佳答案

首先,了解 RPC-style API 和 RESTful API 之间的区别很重要。简单地说,您可以将 RPC API 想象为作为“操作”的“方法”,而 RESTful API 表示您的模型的状态。

例如,假设我们要创建一个端点来处理用户注册。

  • RPC 样式端点可能是 /api/register .一个可以做 X 件事情的寄存器函数。
  • REST 风格的端点可能是 /api/users .不是一个 Action ,而只是一个端点,它为我们提供了存在的用户的状态。 GET 请求将列出用户,POST 请求将创建一个新用户。

  • 话虽如此,可能更清楚一点,一般来说,创建执行 X 次操作的端点可能不是很“安静”,并且使用专门名为“Django REST 框架”的框架可能不会是正确的选择。

    所以在你的特殊情况下。我建议您避免创建作为方法工作的端点,而是将它们视为它们所代表的资源。这意味着如果您需要创建一个新用户,则向用户端点发出请求,然后如果您需要使用该用户创建新文章,则向文章端点发出第二个请求。

    使用信号产生副作用

    我认为如果您确实想要副作用,则应该使用信号来管理它们。例如,假设您想使用联系表单发送电子邮件。而不是拥有 /api/send_email端点,您改为执行 /api/messages/代表 Message 的端点模型,然后在创建新消息时使用信号发送电子邮件。

    通过这样做,它仍然意味着 API 端点本身只代表模型的状态,而修改状态(在创建新消息时发送消息)的副作用转移到信号的责任上。

    关于django - 使用 Django Rest Framework 时,我应该如何构造带有副作用的请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54778823/

    相关文章:

    python - Django 数据迁移类型转换问题

    python - Django 子应用和模块结构

    python - 在数据库中已有数据之后添加的 UUID 字段。有没有办法为现有数据填充 UUID 字段?

    python - Django - 外键约束的独特集合

    django - 尝试运行 Django 应用程序时出现 WSGIServer 错误

    python - 如何通过CreateView保存表单后转到另一个页面

    python - Django Haystack 外键关系

    python - 使用 Django REST Framework ViewSets 表示多个对象/列表 CRUD 操作

    json - 生成的其余 api 没有 count 或 results 属性

    python - 类型错误 : 'method' object is not iterable MySQL