我使用以下代码从Django的html页面返回带有wkhtmltopdf的pdf文件:
currentSite = request.META['HTTP_HOST']
params = { 'idOrganisation': idOrganisation, 'idMunicipalite' : idMunicipalite, 'nomMunicipalite' : nomMunicipalite, 'idUe': idUe, 'dateEvenement': dateEvenement}
command_args = "wkhtmltopdf -s A4 http://%s/geocentralis/fiche-role/propriete/?%s -" % (currentSite, urlencode(params))
process = Popen(command_args.split(' '), stdout=PIPE, stderr=PIPE)
rtn_comm = process.communicate() #better than wait this wait and return for us...
pdf_contents = rtn_comm[0] #if want debug, index 1 return the stderror
r = HttpResponse(pdf_contents, mimetype='application/pdf')
r['Content-Disposition'] = 'filename=fiche-de-propriete.pdf'
return r
代码正常工作,pdf在2-3秒后生成,但经常(间歇性地),在生成pdf之前它会在30-60秒左右生成,而firebug会向我显示“NetworkError:408 Request Timeout。在此期间”挂起“时间,我的Django网站没有回应任何请求。
我在Windows Server 2008上使用Django和IIS。
我正在寻找有关如何解决该问题的任何线索......
答案 0 :(得分:1)
它挂起的原因是因为服务器遇到了竞争/并发问题,并且遇到了死锁(你可能在HTML中使用了一两个相对喜欢的资产)。
您请求PDF,因此服务器会启动wkhtmltopdf
,这会开始生成您的PDF文件。当它到达资产(图像,CSS或JS文件,字体等)时,wkhtmltopdf
会尝试从该服务器加载它......这恰好是正在运行的服务器wkhtmltopdf
。如果服务器无法同时处理多个请求(或者只是不能很好地处理并发),那么它会进入死锁状态:wkhtmltopdf
正在等待等待wkhtmltopdf
完成的服务器上的资产处理,以便它可以将资产提供给等待资产的wkhtmltopdf
......
要在开发中修复此问题,只需 Base64-embed your assets into the HTML 转换为PDF,或临时从其他计算机(例如临时AWS存储桶)提供这些文件。这在生产环境中应该不是问题,因为您的实时服务器(希望)能够处理多个GET请求和线程。