1

在我的 django 应用程序中,我有一个典型的基本模板,其中包含我的 doctype、script 和 css 标签等内容。

为了清晰和代码组织,我将这个基本模板解构为它的组成部分,每个部分都扩展了前一个部分,只添加了一个特定的东西。例如,base/favicon.html:

{% extends "base/chromeframe.html" %}
{% load staticlink %}

{% block metatags %}{{ block.super }}
<link href="{% staticlink 'img/favicon.ico' %}" rel="shortcut icon" type="image/x-icon">{% endblock metatags %}

它扩展了 base/chromeframe.html:

{% extends "base/mobile.html" %}

{% block metatags %}{{ block.super }}{% if 'chromeframe' in request.META.HTTP_USER_AGENT %}
<meta http-equiv="X-UA-Compatible" content="chrome=1">{% endif %}{% endblock metatags %}

这使我的基本模板更易于管理。 我是否为这种方法付出了巨大的性能损失? 基准模板渲染的好方法是什么?

在您建议我使用包含而不是继承之前 - 这不起作用,因为我正在设置被从我的基本模板派生的页面覆盖的块。

我知道我可以对这些模板部分进行某种预编译。

4

2 回答 2

4

我从来没有注意到模板执行时间是页面加载时间的一个重要因素,除非您正在运行一个流量极高的网站,否则担心它可能属于过早优化的范畴。

在几乎所有情况下,优化您的代码以便于开发和维护而不是边际执行速度的提高会为您提供最好的服务。

但是,如果您想了解它需要多长时间,请查看Django 页面上的 profiling

于 2013-03-01T19:22:56.197 回答
3

我已经证实了传统观点——即使有 22 层“不必要的”继承,渲染时间的差异也很小。

我的测试:

import time

from django.core.management.base import BaseCommand
from django.shortcuts import render_to_response as r2r

ITTER=100

class Command(BaseCommand):
    def handle(self, *args, **options):
        start = time.clock()
        for i in range(ITTER):
            r2r('base.html', { 'i': i },)
        middle = time.clock()
        for i in range(ITTER):
            r2r('newbase.html', { 'i': i },)
        end = time.clock()
        print "old way:%f new way:%f" % (middle-start, end-middle)

我煞费苦心地将我的基本模板片段重新集成到 newbase.html 中,发现只有边际性能改进:

旧方式:1.770000 新方式:1.460000

仍然有显着的性能提升,但不足以证明 newbase.html 所导致的不可读的混乱是合理的。

我会在别处寻找优化。

于 2013-03-01T21:24:42.777 回答