【问题标题】:Django-Rest: Reusable application designDjango-Rest:可重用的应用程序设计
【发布时间】:2014-11-12 08:53:27
【问题描述】:

我的应用程序堆栈包括 AngularJs -> Django Rest Framework -> Django。 我正在为我网站上的文章设计一个cmets应用程序。这些文章链接到一个主题实体。现在,为了为这些 cmets 编写 REST 后端,我最终得到的 url 看起来像 -

/topics/(topic_id)/articles/(article_id)/cmets.

因此,我的观点最终会得到如下签名:

get(self, requests, topic_id, article_id, format=None)

评论不需要包含有关本文所附主题的任何信息,但它具有该信息。 我无法弄清楚这是否是一个糟糕的 REST 设计,或者我是否可以在 django 中以更好的方式做到这一点。

顺便说一句,我查看了 cmets 应用程序的通用实现。它似乎依赖于模板标签来获取 article_id 之类的信息,因为我没有使用 django 模板,所以我无法使用它。

【问题讨论】:

    标签: django rest django-rest-framework


    【解决方案1】:

    API 的设计方式很大程度上取决于关系的紧密程度。这不是真正的 REST 问题,也不是 Django 问题,而更像是 url 设计问题。

    您当前正在使用嵌套 url,其中层次结构的每个部分都包含在 url 中,即使它没有用或没有必要。一般建议如果你不需要层次结构的每一部分,就不应该在 url 中,结果你的 url 会变得扁平。 Heroku 的 API design guide 是一本有用的读物​​,但您必须考虑对您的应用程序的影响以及是否值得。

    评论不需要包含有关本文所附主题的任何信息,但它具有该信息。

    这是嵌套设计的问题之一,您最终会得到包含大量无用信息的深度嵌套结构。但重要的是要记住,REST 与您的 API 的 URL 结构完全无关,而是some people do have strong opinions 说明它们应该如何协同工作。

    如果您希望对 url 采用扁平化方法,这会从模式中删除 topicarticle,那么您最终会得到类似于以下的 url:

    /topics/{topic_id}/
    /articles/?topic={topic_id}
    /articles/{article_id}/
    /comments/?article={article_id}
    /comments/{comment_id}/
    

    这将使您无需在 url 中包含主题以及文章,因此只有最重要的信息在 url 中可见:评论信息。

    Django REST Framework 有 great filtering support,可用于制作有用的扁平 API。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-23
      • 2017-05-02
      • 2020-06-26
      • 2010-12-05
      • 1970-01-01
      • 1970-01-01
      • 2012-06-13
      • 1970-01-01
      相关资源
      最近更新 更多