将 REST 添加到 Django [关闭]

Posted

技术标签:

【中文标题】将 REST 添加到 Django [关闭]【英文标题】:Adding REST to Django [closed] 【发布时间】:2010-09-23 10:38:13 【问题描述】:

我有一个运行良好的 Django 应用程序。我正在添加 REST 服务。我正在寻找一些关于我的 REST 策略的额外输入。

以下是一些我绞尽脑汁的例子。

现在,我正在使用带有一堆补丁的 Django-REST API。 我正在考虑退回到简单地在 Django 中编写返回 JSON 结果的视图函数。 我还可以看到在 Apache 中过滤 REST 请求并将它们路由到单独的非 Django 服务器实例。

请为每个答案指定一种方法,以便我们投票赞成或反对。

【问题讨论】:

【参考方案1】:

我正在考虑退回到简单的 在 Django 中编写视图函数 返回 JSON 结果。

显式 可移植到其他框架 不需要修补 Django

【讨论】:

这可以让您保持一定的距离,但是如果您想进行身份验证,请不要重新发明*** - 这就是我们最终在整个网络上出现大量不安全网络应用程序的原因。这就是为什么我们都喜欢 Django auth 模块的原因(我们喜欢吗?我们不是......)。有更多解释的好文章以"I plead with you to follow someone else's example and not roll your own authentication scheme."结尾。 那篇文章有一些非常好的部分,但是作者关于应该将 API 密钥添加到 URL 的断言是错误的,并且是非 RESTful 的。这就是 WWW-Authenticate 和 Authorization 标头的用途。 (有关更全面的解释,请参阅 Mike Amundsen 和 Ron Wail 的 cmets) 虽然我 100% 同意这种观点,但“非 RESTful”并不一定等同于“糟糕”。虽然显然 URL 中的授权代码肯定不好。【参考方案2】:

请注意,REST 不仅仅意味着 JSON 结果。 REST 本质上意味着通过原生但成熟的 HTTP 公开面向资源的 API。我不是 REST 方面的专家,但以下是 Rails 正在做的一些事情。

URL 应该是好的、简单的资源名称 使用正确的 HTTP 方法 HEAD、GET、POST、PUT 和 DELETE 可以选择覆盖(表单参数“_method”将覆盖 HTTP 请求方法) 通过接受请求头支持内容类型协商 可选地使用覆盖(URL 中的文件扩展名将覆盖接受请求标头中的 MIME 类型) 可用的内容类型应包括 XML、Xhtml、HTML、JSON、YAML 和许多其他适当的类型

例如,要获得原生 HTTP 支持,服务器应该响应

GET /account/profile HTTP/1.1
Host: example.com
Accept: application/json

因为它会响应

GET /account/profile.json HTTP/1.1
Host: example.com

它应该响应

PUT /account/profile HTTP/1.1
Host: example.com

var=value

因为它会响应

POST /account/profile HTTP/1.1
Host: example.com

_method=PUT&var=value

【讨论】:

请注意,您也没有完全描述安息。您正在描述成熟度模型的第 2 级。 martinfowler.com/articles/richardsonMaturityModel.html【参考方案3】:

对于正在为 Django 寻找一个非常体面的、可插入的 API 应用程序的其他人,请务必查看 jespern 的 django-piston,它在 BitBucket 内部使用。

它维护得很好,有很多追随者和一些很酷的分支,它们可以添加对分页和其他身份验证方法的支持(开箱即用地支持 OAuth)。

更新以反映不再维护 django-piston。

【讨论】:

Django 活塞不再被视为“维护良好”。尽管代码在或多或少被遗弃时是稳定的,但随着 django(和社区)的发展,它已经并将变得越来越过时。一方面,有大量未解决的错误报告。活塞死了,django-tastypie 和 django-rest-framework 万岁。 pydanny.com/choosing-an-api-framework-for-django.html【参考方案4】:

Tastypie 也是一个新兴的 Django REST 框架。 它与活塞具有相同的思维方式,并且删除了许多样板代码。

【讨论】:

试过了,看起来不错。 它不再是新的,而是它的本质。与 django-rest-framework 一起。 . .两者都有很多追随者并且看起来很成熟。【参考方案5】:

我在这里对同一问题的回答:Framework for Implementing REST web service in Django

简短的版本是,看看 https://github.com/jgorset/django-respite/ 早期的 REST 框架,但我们每天都在客户端项目中使用它。

【讨论】:

【参考方案6】:

废弃 Django REST api 并提出您自己的开源项目,其他人可以为该项目做出贡献。我愿意做出贡献。我有一些基于表单 api 的代码来做 REST。

【讨论】:

【参考方案7】:

我正在考虑退回到简单的 在 Django 中编写视图函数 返回 JSON 结果。

我会选择那个.. Ali A 总结得很好。

对我来说,重点是明确的。我会避免使用自动将对象转换为 json 的函数,如果该对象具有对用户的引用并且密码(即使它是散列的)以某种方式进入 json 片段怎么办?

【讨论】:

【参考方案8】:

我最终使用了我自己的 Django REST API 框架(如果我能找到可行的替代方案,我很想摆脱它),并为我不想的极端情况添加了一些自定义视图处理。一切顺利。

所以是 1 和 2 的组合;如果没有某种形式的框架,您最终会为常见情况编写相同的样板。

我还做了一些独立的 API。我喜欢将它们作为独立的服务,但是它们独立于其他代码的事实导致它们被忽视。没有技术原因;只是看不见,心不在焉。

我真正希望看到的是一种统一 Django 表单和 REST API 的方法,因为它们经常共享很多逻辑。从概念上讲,如果您的应用程序在 HTML 中公开某些内容,它可能也希望以编程方式公开它。

【讨论】:

【参考方案9】:

您可以查看django-dynamicresponse,这是一个轻量级框架,用于将带有 JSON 的 REST API 添加到您的 Django 应用程序。

向现有的 Django 应用程序添加 API 支持只需进行最少的更改,并且可以直接在新项目中从一开始就内置 API。

基本上,除了将返回的上下文序列化为 JSON 或根据请求类型有条件地呈现模板/重定向之外,它还包括将 JSON 解析为 request.POST 的中间件支持。

【讨论】:

【参考方案10】:

您可以尝试创建一个通用函数来处理数据(如提到的 parand),您可以从生成网页的视图以及生成 json/xml/whatever 的视图中调用这些函数

【讨论】:

【参考方案11】:

TastyPie 看起来非常有趣和有前途。它与 Django 配合得很好。

【讨论】:

以上是关于将 REST 添加到 Django [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

将 APIView 添加到 Django REST Framework 可浏览 API [重复]

如何在Django rest框架中一键将学生添加到老师的课堂

如何使用 Django Rest Framework 将 url 字段添加到序列化程序

如何将命名空间 url 添加到 django-rest-framework 路由器视图集

如何在 django rest 框架中仅使用特定变体对象将项目添加到愿望清单?

Django - 如何通过 API 端点使用 rest_framework 动态地将多个对象添加到数据库中