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

Python Django从模板输出中删除所有空行,python,django,Python,Django,我正在呈现一个带有大量嵌套循环和if语句的Django模板。这将导致模板输出约30000行。显然,我需要删除那些空行 我试过: {% spaceless %} {% endspaceless %} 但是,在使用“if”语句时,会抛出一个错误: 第447行上的块标记无效:“endspaceless”,应为“elif”,“else” 或“endif”。您是否忘记注册或加载此标签 我也尝试过: outputStr = str(result._container[0],'utf-8') output

我正在呈现一个带有大量嵌套循环和if语句的Django模板。这将导致模板输出约30000行。显然,我需要删除那些空行

我试过:

{% spaceless %}

{% endspaceless %}
但是,在使用“if”语句时,会抛出一个错误:

第447行上的块标记无效:“endspaceless”,应为“elif”,“else” 或“endif”。您是否忘记注册或加载此标签

我也尝试过:

outputStr = str(result._container[0],'utf-8')
outputStr2 = re.sub(r'^$\n', '', outputStr, flags=re.MULTILINE)
结果是HttpResponse对象。但是空白行没有删除,我不知道如何将字符串转换为字节。

然后,可以选择使用中间件,如本文所建议的:

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


任何帮助都将不胜感激

尝试使用
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')
所有项目

使用中间件 您只需向中间件类添加两个中间件,并启用HTML\u MINIFY设置:

MIDDLEWARE_CLASSES = (
    # other middleware classes
    'htmlmin.middleware.HtmlMinifyMiddleware',
    'htmlmin.middleware.MarkRequestMiddleware',
)
HTML_MINIFY = True
请注意,如果您使用的是Django的缓存中间件,则MarkRequestMiddleware应该在FetchFromCacheMidleware之后,而HtmlMinifyMiddleware应该在UpdateChemiddleware之后:

MIDDLEWARE_CLASSES = (
    'django.middleware.cache.UpdateCacheMiddleware',
    'htmlmin.middleware.HtmlMinifyMiddleware',
    # other middleware classes
    'django.middleware.cache.FetchFromCacheMiddleware',
    'htmlmin.middleware.MarkRequestMiddleware',
)
您可以选择指定HTML\u缩小设置:

MIDDLEWARE_CLASSES = (
    # other middleware classes
    'htmlmin.middleware.HtmlMinifyMiddleware',
    'htmlmin.middleware.MarkRequestMiddleware',
)
HTML_MINIFY = True
HTML_MINIFY设置的默认值为not DEBUG。如果要在启用调试时缩小HTML代码,只需将其设置为True


参考资料:

我不喜欢仅仅为此添加新的依赖项。我选择了一种不同的方法,使用自定义模板标记,
lineless
只是一个名称

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

完整代码
templatetags/custom_filters.py

来自django.template导入库,节点
寄存器=库()
@register.tag
def lineless(解析器、令牌):
nodelist=parser.parse(('endlineless',))
parser.delete_first_token()
返回LinelessNode(节点列表)
类LinelessNode(节点):
定义初始化(自我,节点列表):
self.nodelist=节点列表
def呈现(自身、上下文):
input\u str=self.nodelist.render(上下文)
输出_str=''
对于输入字符串中的行拆分行():
如果line.strip():
输出字符串='\n'.连接((输出字符串,行))
返回输出
举例
{%load custom_filters%}{%lineless%}
...
{%endlineless%}
或者,如果要保持HTML和Blocks语法正确:

{%load custom_filters%}{%lineless%}
...
{%endlineless%}
  • 可读的HTML不是生产的要求,它只是给服务器增加了更多的压力。因此,最好是只在调试模式下激活它

这感觉是一个很棒的解决方案。使用后将测试并添加更多注释。