如何在Django中间件__call__方法中修改response.content

时间:2019-02-19 01:07:42

标签: python django

我试图通过在中间件中处理XML响应中的所有空白行,如本示例中所示:https://code.djangoproject.com/wiki/StripWhitespaceMiddleware
现在的问题是,在Django 2.1中,自Dajngo 1.10起,该代码不再是最新的,中间件的工作方式也发生了很大变化。
现在,我看到response.content是字节类型的,因此使用正则表达式无法直接进行编辑。
在Django 1.10+中执行此操作的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

正如您所说的,response.contentbytes,因此正则表达式中的所有参数都必须为byte类型,包括替换字符串。

    def __init__(self):
        self.whitespace = re.compile(b'^\s*\n', re.MULTILINE)
        #self.whitespace_lead = re.compile(b'^\s+', re.MULTILINE)
        #self.whitespace_trail = re.compile(b'\s+$', re.MULTILINE)


    def process_response(self, request, response):
        if "text" in response['Content-Type']:
        #Use next line instead to avoid failure on cached / HTTP 304 NOT MODIFIED responses without Content-Type
        #if response.status_code == 200 and "text" in response['Content-Type']:
            if hasattr(self, 'whitespace_lead'):
                response.content = self.whitespace_lead.sub(b'', response.content)
            if hasattr(self, 'whitespace_trail'):
                response.content = self.whitespace_trail.sub(b'\n', response.content)
            if hasattr(self, 'whitespace'):
                response.content = self.whitespace.sub(b'', response.content)
            return response
        else:
            return response    

来自documentation

  

要搜索的模式和字符串都可以是Unicode字符串(str)   以及8位字符串(字节)。 但是,Unicode字符串和8位   字符串不能混合:也就是说,您无法匹配Unicode字符串   具有字节模式,反之亦然;同样,要求   替换,替换字符串必须与两者具有相同的类型   模式和搜索字符串。