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

时间:2018-08-16 15:55:05

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

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

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

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

1 个答案:

答案 0 :(得分:3)

Django在服务器端

进行渲染

渲染在服务器端进行。如果您这样在模板中写{{ foo.bar }},则客户端从不知道模板中有foo.bar。通过(HTML)输出替换标签等是由Django渲染引擎完成的。

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

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

此外,模板可以包含一些您不希望与客户端共享的逻辑。通过在服务器上呈现它,客户端实际上看不到HTML的呈现方式(当然,经验丰富的开发人员可以进行一些“猜测”,并且过一会儿可以对呈现的方式有所了解)。

但是,渲染的“产品”仍然可能导致其他调用

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

某些技术在客户端

呈现

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

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