django - 何时使用 API 与 Django 内置函数

标签 django rest django-rest-framework

我有一个使用 django 构建的网站/ native 应用程序组合。为了支持 native 应用程序,我使用 django-rest-framework 构建了一个 api 后端。我在多个来源中读到这是 a good idea现在,如果我想与数据库交互,我似乎有太多选择,我想知道什么是行业最佳实践。

例如,如果我想显示一个简单的表单来更新用户,根据我过去的 django 经验,我会倾向于创建一个 UpdateView。但是,我现在想知道是否应该构建一个通过 AJAX 发布到我的用户 API 端点的表单。根据我的阅读,第二个选项似乎更符合 API 优先的方法。

但是,这也需要我做更多的前期工作来有效地重建许多内置的 django 功能。另外,在我看来,这效率较低,因为以前涉及单个 HTTP 请求的页面现在将需要多个。针对每页多个 HTTP 请求的优化问题是否有效?是否存在我应该警惕的上限(例如,如果我允许用​​户在单个页面上更新/插入数十条记录)?

最佳答案

Also, it seems to me that this is less efficient, as pages that before involved a single HTTP request now will require multiple.

欢迎来到单页应用程序世界:)

你说得完全正确,这是困扰许多SPA风格网站的问题。与返回服务器呈现的 HTML 页面的单个 HTTP 调用相比,执行多个 API 调用始终会导致网站/应用程序的前期加载时间更长。

构建“经典”网站没有任何问题,虽然遵循“API 优先”有其优点,但并不会使其他构建网站的方法失效。构建单页应用程序将不可避免地让您重写 Django 免费提供的许多东西,例如表单或 i18n。另一方面,前端和后端的彻底分离可以更轻松地管理和雇用在应用程序的不同部分工作的不同人员。

在不确切知道您要构建什么的情况下,很难给您直接的答案。但我可以根据我的经验给你一些建议。

根据您的前端定制 API。

开发人员似乎喜欢构建漂亮的 REST API:每个资源都有自己的端点、正确的 HTTP 响应、PUT、POST、DELETES 等。但是,如果您的前端需要执行 20 个请求才能提交单个表单,那么这些都是无用的。务实一点。为您的前端构建一个端点,在单个 HTTP 调用中完成所需的一切。这并不容易,但也更安全,您可以在单个数据库事务中完成所有操作,并在发生错误时回滚。

预热你的前端

您的某些端点可能永远不会或很少改变。您可能有一个“国家/地区”端点,它返回要在下拉列表中显示的国家/地区列表,或者您的用户可能有一个不经常更改的联系人列表。您可以将所有这些信息放在一个端点中,并使前端在打开页面时立即加载它。

在某些端点中返回预渲染的 HTML。

我过去这样做过,有些人想为此杀了我:)我们有一个动态表单,它根据后端的某些配置而变化。这样做是一种“纯 API”方式,需要构建一个端点仅返回此配置,然后在前端动态构建表单。不仅如此,我们还必须将表单验证与后端模型验证相匹配。在我看来,这浪费了很多时间。 DRF 有一个很好的技巧,您实际上可以告诉 DRF 将序列化器渲染为 HTML 表单,然后您可以自定义表单模板并使其返回 Angular 或 React 模板(如果您愿意)。

GraphQL

GraphQL 有点是为了解决此类问题而构建的,但我从未在 Django 中构建过 GraphQL 后端,因此我无法就此提供太多建议。

关于django - 何时使用 API 与 Django 内置函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54816095/

相关文章:

python - DRF : How to password protect the DefaultRouter

python - DjangoRestFramework 如何在 View 集中获取用户

django dateTime 小部件未显示

python - Django:创建新项目时,弹出 "django-admin.py: command not found"错误

javascript - 使用需要 header 并提供内容的 REST 请求下载文件

python - Django Rest Framework 的测试请求无法由其自己的 Request 类解析

Django JWT 获取用户信息

rest - 如何在 Web Api Core 中设计多个 Fe​​tch 请求

java - 创建 JAX-RS 提供程序以从 InputStream 创建 Java Image

Django rest 框架发送带单引号的字符串而不是带双引号的 JSON