我试图通过在中间件中处理XML响应中的所有空白行,如本示例中所示:https://code.djangoproject.com/wiki/StripWhitespaceMiddleware
现在的问题是,在Django 2.1中,自Dajngo 1.10起,该代码不再是最新的,中间件的工作方式也发生了很大变化。
现在,我看到response.content是字节类型的,因此使用正则表达式无法直接进行编辑。
在Django 1.10+中执行此操作的正确方法是什么?
答案 0 :(得分:0)
正如您所说的,response.content
是bytes
,因此正则表达式中的所有参数都必须为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
要搜索的模式和字符串都可以是Unicode字符串(str) 以及8位字符串(字节)。 但是,Unicode字符串和8位 字符串不能混合:也就是说,您无法匹配Unicode字符串 具有字节模式,反之亦然;同样,要求 替换,替换字符串必须与两者具有相同的类型 模式和搜索字符串。