Django从模板输出中删除所有空行

时间:2018-03-29 05:57:23

标签: python django

我正在渲染一个包含大量嵌套循环和if语句的Django模板。这导致模板输出大约30 000行。显然我需要删除那些空行!

我试过了:

{% spaceless %}

{% endspaceless %}

然而,如果'使用它,我会遇到错误。介于两者之间的陈述:

  

第447行的无效广告代码:'无空格',预期' elif''其他'   或者' endif'。您是否忘记注册或加载此标记?

我也尝试过:

outputStr = str(result._container[0],'utf-8')
outputStr2 = re.sub(r'^$\n', '', outputStr, flags=re.MULTILINE)

结果是HttpResponse对象。但是,空行不会被删除,我不确定如何将字符串转换回字节。

然后存在使用中间件的选项,例如这篇文章建议:

How to remove spaces and empty lines from HTML in Django?

这对我来说似乎有点危险。所以我想避免这种情况。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:3)

尝试使用django-htmlmin

pip install django-htmlmin
  

单个视图

使用装饰器 django-htmlmin还提供了一个装饰器,你只能在想要缩小响应的视图上使用它:

from htmlmin.decorators import minified_response

@minified_response
def home(request):
    return render_to_response('home.html')
  

所有项目

使用中间件 您需要做的就是将两个中间件添加到MIDDLEWARE_CLASSES并启用HTML_MINIFY设置:

MIDDLEWARE_CLASSES = (
    # other middleware classes
    'htmlmin.middleware.HtmlMinifyMiddleware',
    'htmlmin.middleware.MarkRequestMiddleware',
)

请注意,如果您使用Django的缓存中间件,MarkRequestMiddleware应该使用FetchFromCacheMiddleware,而HtmlMinifyMiddleware应该使用UpdateCacheMiddleware:

MIDDLEWARE_CLASSES = (
    'django.middleware.cache.UpdateCacheMiddleware',
    'htmlmin.middleware.HtmlMinifyMiddleware',
    # other middleware classes
    'django.middleware.cache.FetchFromCacheMiddleware',
    'htmlmin.middleware.MarkRequestMiddleware',
)

您可以选择指定HTML_MINIFY设置:

HTML_MINIFY = True

HTML_MINIFY设置的默认值不是DEBUG。如果要在启用DEBUG时缩小HTML代码,则只需将其设置为True。

参考:https://github.com/cobrateam/django-htmlmin

答案 1 :(得分:2)

我使用自定义模板标记选择不同的名称,lineless只是一个名称。

它只删除空行,带有空格或Python strip()检测到的任何字符的行作为空格。

完整代码

templatetags/custom_filters.py

from django.template import Library,Node

register = Library()

@register.tag
def lineless(parser, token):
    nodelist = parser.parse(('endlineless',))
    parser.delete_first_token()
    return LinelessNode(nodelist)


class LinelessNode(Node):
    def __init__(self, nodelist):
        self.nodelist = nodelist

    def render(self, context):
        input_str = self.nodelist.render(context)
        output_str = ''
        for line in input_str.splitlines():
            if line.strip():
                output_str = '\n'.join((output_str, line))
        return output_str

使用示例

<!DOCTYPE html>{% load custom_filters %}{% lineless %}

...

</html>{% endlineless %}