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

时间:2019-02-20 04:24:04

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

首先,重要的是要了解RPC样式的API和RESTful API之间的区别。简而言之,您可以将RPC API想象成是“动作”的“方法”,而RESTful API则代表了模型的状态。

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

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

话虽如此,通常来说,创建执行X次操作的端点可能不是很“轻松”,并且使用专门命名为“ Django REST 框架”可能不是正确的选择。

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

使用副作用信号

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

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