【问题标题】:django call to custom method in model when rendering the page渲染页面时django调用模型中的自定义方法
【发布时间】:2019-01-23 15:35:48
【问题描述】:

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

我很确定当我从我的视图返回 render() 时,渲染发生在服务器端,并且作为 HTML 的输出返回给客户端。

如果我的理解不正确,请纠正我。

【问题讨论】:

  • 否,因为模板由客户端呈现。后端呈现 整个 响应并将其发送给客户端。

标签: django django-models django-templates django-views django-2.0


【解决方案1】:

Django 在服务器端呈现

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

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

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

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

但渲染的“产品”仍然会导致额外的调用

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

一些技术在客户端呈现

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

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

【讨论】:

  • 因此,如果我添加 MyModel.objects.all() 并将其添加到上下文中,但从不在模板中显示与 MyModel 上下文相关的任何内容,则不会由于延迟加载而发生数据库查询。对吗?
  • @Asdfg: 是的,QuerySets 是懒惰的,所以如果你消耗它们(例如通过迭代、检查对象的数量等),您通常从不执行此类查询。当然,如果您将 list(..) 包裹在查询集上(在视图中),但从不呈现结果,则 list(..) 会强制 QuerySet 进行评估。这就是为什么最好将QuerySets 而不是具体化列表传递给模板的原因之一。
  • 谢谢威廉。你太棒了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
  • 2011-11-21
相关资源
最近更新 更多