使用 Django Rest Framework 时,应该如何构建具有副作用的请求?

Joh*_*cos 5 django django-models webhooks django-rest-framework

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

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

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

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

Mar*_*ind 6

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

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

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

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

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

使用信号产生副作用

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

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