【问题标题】:Deviding Django application (social network) to Django Frontend and RESTfull API将 Django 应用程序(社交网络)划分为 Django 前端和 RESTful API
【发布时间】:2012-08-16 07:19:04
【问题描述】:

我正在编写 Django 应用程序(社交网络)并考虑将单体项目分为两个项目:UI 和 API。例如,Django 将仅用于呈现页面、与 API 交互和从 API 获取数据,编写在 web.py 上。

优点如下:

  1. 我可以独立开发和测试API。
  2. 将来可能会出现其他 UI(例如移动),这需要服务。
  3. 我打算外包 Web UI 开发,所以,如果我的应用程序有两个模块,我可以只提供一个 UI 外部,不共享应用程序的逻辑。

缺点如下:

  1. 我一个人工作,开发两个项目更难,然后一个。
  2. 我将无法使用酷炫的 Django 管理面板。我需要自己写。
  3. 与 Django 相比,web.py 更底层。

这就像一个大脑转储,但如果您分享您使用 UI 模块和独立 API 模块创建 Web 应用程序的经验,我将不胜感激。

更新(更具体的问题,正如 Mike 所问的)

你将使用什么 Python 框架来创建社交网络的 REST API,它可以被不同的客户端应用程序使用?使用仅返回 JSON 并由 Django for web 呈现的 web.py 是个好主意吗?

谢谢, 鲍里斯。

【问题讨论】:

  • 我认为您应该提出一个更具体的问题,但对关注此对话非常感兴趣。
  • 你说得对,@MikeScott,说得更具体了。
  • 我想知道在前端完全使用 Javascript 是否是个好主意。在某些过程中,无论如何您都必须使用它,如果您的数据完全来自 API,为什么不直接使用 Javascript 甚至不通过 Django。我认为这在性能方面也是一个好主意,因为您的所有代码在前端都是静态的。您可以使用众多 JS MVC 框架之一。
  • @Torsten,正如我现在所看到的,Django 不仅会生成静态网页,还会生成 i18n 的东西。 i18n 可以在 JS MVC 框架中简单实现吗?
  • @Marboni 有在 Javascript 中做 i18n 的解决方案。根据您要使用的框架,您当然必须搜索它是否存在。我自己还没有使用它,虽然我可以通过简短的搜索看到有多种通用解决方案,其中大多数也使用 gettext。

标签: django web-applications web.py


【解决方案1】:

我遇到过和你类似的情况。我最终在 Django 中编写了 UI 和 API 部分。目前,我在同一个流程/项目中为他们提供服务。您提到您希望能够外包 UI 开发,但请听我说完。

同时,我已经使用 django-piston 实现了 RESTful 前端,但做了一些准备工作:

  1. 将所有 DB 和 ORM 访问封装到一个库中。您可以为整个项目执行此操作,也可以逐个应用执行此操作。该库不仅是您的数据库访问的低级包装器,而且还可以用于更高级别的“问题”,例如“all_cmets_posted_by_friends()”或其他东西。这完成了两件事:
    1. 您可以从 UI 视图和 API 视图中调用您的预设查询,而无需在多个位置重新实现它们。
    2. 如果您以后想要使用 NoSQL 数据库,例如,使用其他分布式存储模型,您将能够替换一些(如果不是全部)底层数据库逻辑。您可以提前设置您的整个应用,而无需在一开始就担心复杂的细节。
  2. API 的身份验证层能够接受基于 HMAC/令牌的标头以进行编程访问和正常的 Django 身份验证。我以这样一种方式设置视图,即它们将为程序化客户端呈现纯 JSON(基于内容类型),如果人类从浏览器浏览,它们将呈现 HTML 中的数据结构(带有可点击的链接和可点击的文档字符串) .这使得 API 可以被人类完全探索和点击,而无需阅读任何文档,同时客户端只需通过 JSON 即可轻松处理它。

实际上,我构建的数据库层用作内部 API。如果您愿意,可以从多个应用程序、多个进程中使用相同的数据库层。 UI 视图和 REST 视图都在 Django 中实现。它们可以在同一个进程中,也可以在不同的进程中(只要它们现在可以访问同一个数据库)。

【讨论】:

  • 感谢您的回答,@jbrendel!请通过示例澄清这一点:“这使得 API 可以完全被人类探索和点击,而无需阅读任何文档”
  • 为此,您不需要任何有关 URI 模式或在何处查找资源的先验知识,这一点很重要。一切都应该可以通过链接发现。因此,您不必知道您的消息位于 /foo/messages,而您的用户位于 /bar/users。或者您需要执行 /foo/messages/user/smith 来获取用户的所有消息,而不是 /bar/users/smith/messages 来获取它们。当您必须记住所有这些并提前了解这些时
  • 抱歉,我花了很长时间编辑我的评论。这是完整的:您不需要任何有关 URI 模式或在哪里可以找到资源的先验知识。只需通过以下链接,一切都应该被发现。您应该只需转到“/”并能够访问所有内容的链接:查看顶级列表的链接,单击那里,查看项目列表,单击项目,查看属性列表和链接(不仅仅是 ID!)任何其他引用/来自它的东西。当人类浏览时,我还在 HTML 输出中提供文档字符串,内省输入表单并对其进行总结,让他们知道可以发布什么。
猜你喜欢
  • 2018-03-04
  • 1970-01-01
  • 2011-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多