RESTful API:如何判断GET检索的对象是否可由当前用户编辑(例如,PUT-able)?

时间:2016-02-24 23:26:11

标签: django rest django-rest-framework frontend

目前我使用Django设置RESTful API后端,我可以通过以下GET列出一组文章:

api/articles/

另外,我可以通过以下方式获得一篇文章:

api/article/1/

每篇文章都归某个用户所有,一个用户当然可以有多篇文章。

在页面端,我在加载页面时显示所有文章,我希望当前登录的用户可以看到他们拥有的文章以不同的风格,例如,用方框勾勒出来,以及有一个关联的“删除”或“编辑”按钮。

这要求我在检索文章后,以编程方式告知当前用户拥有哪些文章。一种方法是使用所有者ID检查当前用户ID。但是我觉得这不是一个好的选择,因为用户ID是在客户端完全完成检查,可能与实际的服务器判断不一致。

因此,有没有办法,通过查看GET的响应来判断(例如,让服务器返回属性“editable = true / false”)以获取当前用户是否可以编辑(PUT)资源?

我知道这可以在服务器端完成,方法是手动附加这样的属性。但是,我只想问是否有更好的/普遍的做法。

我刚刚开始学习网页开发,如果这个问题听起来微不足道,我很抱歉。谢谢!

2 个答案:

答案 0 :(得分:2)

您可以按照建议手动附加礼仪。这种方法的进步是你不需要任何其他的http请求。

第二种可能性是,您的客户有意请求有关端点权限的信息。在这种情况下,我建议使用OPTIONS HTTP方法。您将OPTIONS HTTP请求发送到api / articles / 1,后端返回想要的信息。这可能正是OPTIONS方法和DRF元数据的用途。

http://www.django-rest-framework.org/api-guide/metadata/

答案 1 :(得分:0)

我认为这是一个非常有趣的问题。

有几种选择:

  • 您可以在GET api/article/1响应中添加包含此信息的HTTP标头,即HTTP_METHODS_ALLOWED=PUT,PATH,DELETE。这样做有助于API客户端,因为它不需要知道任何其他内容。我认为当返回多个实体时,这不是一个好方法。
  • 致电OPTIONS api/article/1。可以返回该资源上该用户的允许方法,但请注意,在我看来,这种方法在性能方面不是很好,因为它复制了对服务器的请求数。
  • 但是如果返回的实体还包含有关所有者的信息呢?可以,在这种情况下,客户知道哪个政策适用并试图自己弄清楚它?请注意,策略可以从另一个端点获取(只需要一次调用),甚至可以使用登录响应。如果您的实体不包含这类信息,它也可以作为HTTP标头返回(如上面的第一个选项)