渲染页面时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)获得,并且这些调用可能需要一些额外的安全性(例如要求数据的呼叫,通常需要再次检查凭据)。
如果我在我的 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)获得,并且这些调用可能需要一些额外的安全性(例如要求数据的呼叫,通常需要再次检查凭据)。