【问题标题】:How should I structure requests with side effects when using Django Rest Framework?使用 Django Rest Framework 时,我应该如何构建具有副作用的请求?
【发布时间】:2019-07-13 16:46:45
【问题描述】:

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

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

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

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

【问题讨论】:

  • 如果创建了新用户,您不会为此获得 webhook 吗?
  • @Headmaster 不幸的是,没有。任务只有 webhook :(

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


【解决方案1】:

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

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

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

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

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

使用信号实现副作用

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

通过这种方式,仍然意味着 API 端点本身只是代表模型的状态,而修改状态(在创建新消息时发送消息)的副作用被转移到信号的职责.

【讨论】:

  • 很好的解释!
  • 感谢您的反馈。这是一个有用的区别。对于大多数 API 端点,我使用的是基于资源的设计(例如messages)。我只是从几个 webhook 中脱离出来,因为请求数据是由我无法控制的外部服务定义的(它是我们集成的 SaaS 工具)。
猜你喜欢
  • 2020-07-04
  • 1970-01-01
  • 2019-08-20
  • 1970-01-01
  • 2018-10-09
  • 2017-05-12
  • 1970-01-01
  • 1970-01-01
  • 2020-02-16
相关资源
最近更新 更多