从Django html视图生成pdf在Windows Server 2008上使用带有IIS的wkhtmltopdf间歇性地挂起

时间:2013-11-20 22:39:32

标签: django iis wkhtmltopdf

我使用以下代码从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。

我正在寻找有关如何解决该问题的任何线索......

1 个答案:

答案 0 :(得分:1)

它挂起的原因是因为服务器遇到了竞争/并发问题,并且遇到了死锁(你可能在HTML中使用了一两个相对喜欢的资产)。

您请求PDF,因此服务器会启动wkhtmltopdf,这会开始生成您的PDF文件。当它到达资产(图像,CSS或JS文件,字体等)时,wkhtmltopdf会尝试从该服务器加载它......这恰好是正在运行的服务器wkhtmltopdf。如果服务器无法同时处理多个请求(或者只是不能很好地处理并发),那么它会进入死锁状态:wkhtmltopdf正在等待等待wkhtmltopdf完成的服务器上的资产处理,以便它可以将资产提供给等待资产的wkhtmltopdf ......

要在开发中修复此问题,只需 Base64-embed your assets into the HTML 转换为PDF,或临时从其他计算机(例如临时AWS存储桶)提供这些文件。这在生产环境中应该不是问题,因为您的实时服务器(希望)能够处理多个GET请求和线程。