IIS上的django-wkhtmltopdf:[WinError 6]句柄无效

时间:2019-03-20 11:24:52

标签: django python-3.x subprocess iis-10

这是我的第一个问题,因此,如果我忘了提什么或它有问题,请原谅我:)

我在IIS(10)-Windows Server上设置了python(3.5.3)-django(2.1.5)-project。一切正常。

问题

只有wkhtmltopdf(0.12.5)具有奇怪的行为。

当我在localhost上运行它时,命令提示符给了我

Loading pages (1/6)
Counting pages (2/6)
Resolving links (4/6)
Loading headers and footers (5/6)
Printing pages (6/6)
Done

我可以按预期在我的下载文件夹中找到生成的.pdf文件。

当我将ALLOWED_HOSTS更改为服务器的IP并调用该网址以生成pdf时,它表示存在

  

/ pdf /

处的OSError      

[WinError 6]句柄无效

使用追溯:

  

文件   “ C:\ my_project \ myenv \ lib \ site-packages \ django \ core \ handlers \ exception.py”   在内部     34. response = get_response(request)

     

文件   “ C:\ my_project \ myenv \ lib \ site-packages \ django \ core \ handlers \ base.py”   在_get_response中     156. response = self.process_exception_by_middleware(e,request)

     

文件   “ C:\ my_project \ myenv \ lib \ site-packages \ django \ core \ handlers \ base.py”   在_get_response中     154. response = response.render()

     

文件   “ C:\ my_project \ myenv \ lib \ site-packages \ django \ template \ response.py”   在渲染     106. self.content = self.rendered_content

     

文件   “ C:\ my_project \ myenv \ lib \ site-packages \ wkhtmltopdf \ views.py”   在render_content中     80. cover_template = self.resolve_template(self.cover_template)

     

文件   “ C:\ my_project \ myenv \ lib \ site-packages \ wkhtmltopdf \ utils.py”   在render_pdf_from_template中     237. cover_filename = cover.filename(如果没有其他说明,则为None)

     

文件   “ C:\ my_project \ myenv \ lib \ site-packages \ wkhtmltopdf \ utils.py”   在convert_to_pdf中     166. return wkhtmltopdf(pages = pages,** cmd_options)

     

文件   “ C:\ my_project \ myenv \ lib \ site-packages \ wkhtmltopdf \ utils.py”   在wkhtmltopdf中     147. return check_output(ck_args,** ck_kwargs)

     

check_output中的文件“ C:\ Program Files \ Python35 \ lib \ subprocess.py”     316。** kwargs).stdout

     

文件“ C:\ Program Files \ Python35 \ lib \ subprocess.py”正在运行     383.使用Popen(* popenargs,** kwargs)作为进程:

     

初始化中的文件“ C:\ Program Files \ Python35 \ lib \ subprocess.py”     640. errread,errwrite)= self._get_handles(stdin,stdout,stderr)

     

_get_handles中的文件“ C:\ Program Files \ Python35 \ lib \ subprocess.py”     884. errwrite = _winapi.GetStdHandle(_winapi.STD_ERROR_HANDLE)

     

异常类型:/ pdf /中的OSError   异常值:[WinError 6] Das   处理ung

我在C:\Users\myapplicationpool\AppData\Local\Temp文件夹中看到wkhtmltopdf正在生成一个名为wkhtmltopdfgn1s7k5r.html的.html文件,但进度却被卡住了。

正如herehere所述,其他人也有相同的问题。但是改变

if 'stdout' in kwargs:
    raise ValueError('stdout argument not allowed, it will be overridden.')
process = Popen(stdout=PIPE, *popenargs, **kwargs)

if 'stdout' in kwargs:
    raise ValueError('stdout argument not allowed, it will be overridden.')
kwargs.pop('stderr', None)
process = Popen(stdout=PIPE, stderr=PIPE, stdin=PIPE, *popenargs, **kwargs)

无效。我认为此解决方案仅适用于Python 2.7的subprocess.py文件,并且我使用的是Python 3+,并且此文件的功能已更改。

我向IUSRIIS_USRS-用户授予了wkhtmltopdf-folder的完全权限,其中bin-folder和wkhtmltopdf.exe所在,因为我读到这也可能有所帮助,但没有

问题

还有其他人知道我可以尝试如何帮助我吗?

这个问题是否真正存在于wkhtmltopdf和python的子进程中,还是我不得不在IIS中更改/添加FastCgiModule的djangohandler的处理程序?我该怎么办?

为什么当我以本地主机在本地服务器上运行它而没有任何问题,但是通过服务器IP调用页面时却不能正常运行,为什么呢? -如前所述:其他一切都很好。

设置

我将wkhtmltopdf添加到INSTALLED_APPS并按如下所示进行设置:

settings.py

WKHTMLTOPDF_CMD = 'C:/wkhtmltopdf/bin/wkhtmltopdf'

(正如我还读到的那样,将其安装在'Program Files'中时,由于路径中的空格经常会出现问题。)

urls.py

path('pdf/', views.MyPDFView.as_view(), name='pdfview'),

views.py

from wkhtmltopdf.views import PDFTemplateResponse
class MyPDFView(View):
    template_name='mypdfview.html'

    def get(self, request):
        response = PDFTemplateResponse(request=self.request,
                                       template=self.template_name,
                                       filename='hello' + '.pdf',
                                       context=self.context,
                                       show_content_in_browser=False,
                                       cmd_options={
                                        'margin-top': 50,
                                        },
                                       )
        return response

mypdfview.html

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Hello World</title>
</head>
<body>
    <h1>Some headline here.</h1>
</body>
</html>

编辑1: 不知何故我的问候消失了-添加了... 编辑2: 看来我不允许说:“大家好”!?

1 个答案:

答案 0 :(得分:0)

要执行与python 2.7相同的解决方法,您需要使用方法wkhtmltopdf()编辑 wkhtmltopdf / utils.py 文件:

from .subprocess import check_output, PIPE

...

def wkhtmltopdf(pages, output=None, **kwargs):
    ...  

    except (AttributeError, IOError):
        # can't call fileno() on mod_wsgi stderr object
        pass

    # add this:
    if not ck_kwargs.get('stderr'):
        ck_kwargs['stderr'] = PIPE

    return check_output(ck_args, **ck_kwargs)