Python Werkzeug响应太慢
我有以下Werkzeug应用程序用于将文件返回给客户:Python Werkzeug响应太慢,python,apache,mod-wsgi,httpresponse,werkzeug,Python,Apache,Mod Wsgi,Httpresponse,Werkzeug,我有以下Werkzeug应用程序用于将文件返回给客户: from werkzeug.wrappers import Request, Response @Request.application def application(request): fileObj = file(r'C:\test.pdf','rb') response = Response( response=fileObj.read() ) response.headers['content-t
from werkzeug.wrappers import Request, Response
@Request.application
def application(request):
fileObj = file(r'C:\test.pdf','rb')
response = Response( response=fileObj.read() )
response.headers['content-type'] = 'application/pdf'
return response
我想重点关注的部分是:
response = Response( response=fileObj.read() )
在这种情况下,响应大约需要500毫秒(C:\test.pdf
是一个4 MB的文件。Web服务器在我的本地计算机中)
但如果我把这句话改写成这样:
response = Response()
response.response = fileObj
现在,响应大约需要1500毫秒(慢3倍)
如果这样写:
response = Response()
response.response = fileObj.read()
现在,响应大约需要80秒(没错,80秒)
为什么这三种方法之间有这么大的差异?第三种方法为什么这么慢?我不能给你一个确切的答案,解释为什么会发生这种情况,但是可能有助于解决你的下属问题。答案很简单:
经过一些测试,我想我已经找到了答案 @Armin已经解释了为什么x.read()
response = Response() response.response = fileObj.read()
…太慢了。但这并不能解释为什么response = Response( response=fileObj.read() )
response = Response() response.response = fileObj.read()
…太快了。它们看起来是一样的,但显然不是。否则就不会有速度上的巨大差异 这里的关键在于文档的这一部分: 响应可以是任何类型的iterable或string。如果它是一个字符串,则认为它是一个iterable,其中一项是传递的字符串 i、 当你给构造函数一个字符串时,它被转换成一个iterable,字符串是它唯一的元素。但是当您这样做时:response = Response( response=fileObj.read() )
,字符串将按原样处理 因此,要使其行为类似于构造函数,必须执行以下操作:response.response=fileObj.read()
response.response = [ fileObj.read() ]
现在文件被尽可能快地发送。我展示的第一种方法:
将响应设置为字符串,只需500毫秒。这对我来说似乎相当快。Response(Response=fileObj.read())