渲染页面时django调用模型中的自定义方法

django call to custom method in model when rendering the page

如果我在我的 Model 中有一个自定义方法,我在我的 template 中调用,这是否意味着从客户端(浏览器)到服务器发生了多次往返?

我很确定当我 return render() 时,渲染发生在服务器端并且 HTML 的输出被 returned 到客户端.

理解有误请指正

Django 在服务器端呈现

渲染发生在服务器端。如果您因此在模板中写入 {{ foo.bar }},客户端 永远不会 知道模板中有一个 foo.bar。用(HTML)输出替换标签等由 Django 渲染引擎完成。

该呈现的结果 通过 HTTP 响应提供给客户端。所以响应本身,不包含渲染逻辑,它包含渲染的"product"。如果您因此在模板中执行 {{ SomeModel.objects.all() }}(假设您当然传递了对模型的引用),那么它通常会导致额外的 database 查询,但这是 由客户端管理。客户端不知道模板调用了什么逻辑

这也可以使应用程序更安全,因为客户端无法访问模板本身,因此无法更改模板来获取敏感信息。当然通过设计特定的查询输入,还是可以让模板return敏感数据。

此外,模板可以包含一些您不想与客户共享的逻辑。通过在服务器上渲染它,客户端实际上看不到 HTML 是如何渲染的(当然有经验的开发人员可以做一些 "guesswork" 并且在一段时间后可以对渲染是如何发生的有一些想法).

但渲染的 "product" 仍然会导致 额外的 调用

但是,结果可能会导致额外调用。例如,如果您的结果包含 <img src="">、样式表链接等和其他 URL,浏览器通常也会开始获取这些内容。此外,如果您定义执行 AJAX 调用的 JavaScript,这些调用会导致额外的 HTTP 请求,但这些请求不会在该特定模板的 rendering 时间完成。这些 "independent" 调用稍后会再次导致渲染。

一些技术在客户端呈现

请注意,它本身并不总是那样。一些技术,如 Angular,在客户端完成(大部分)渲染。在这种情况下,有 JavaScript 代码调用 API,然后 "unfolds" 和 "HTML" 由开发人员指定。因此,完全可以调用 Web 服务请求推文,然后让 DOM 中的一些 JavaScript "inject" HTML 代码相应地呈现推文。这样做的好处是可以很容易地动态更改内容(例如在浏览器中频繁更新某个产品的值)。

然而,这要求呈现的数据可通过 API(以及可以通过 HTTP 请求访问的 API)获得,并且这些调用可能需要一些额外的安全性(例如要求数据的呼叫,通常需要再次检查凭据)。