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

2024-01-10

这是我的第一个问题,所以如果我忘记了要提及的内容或者有什么问题,请原谅我:)

我在 IIS(10)-Windows Server 上设置了一个 python(3.5.3)-django(2.1.5) 项目。一切都很好。

Problem

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

当我在本地主机上运行它时,命令提示符会给我

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,我调用url来生成pdf,它说有一个

/pdf/ 处的操作系统错误

[WinError 6] 句柄无效

与回溯:

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

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

文件 “C:\my_project\myenv\lib\site-packages\django\core\handlers\base.py” 在_get_response中 154. 响应=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” 在渲染内容中 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 if cover else 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.返回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”在init640. 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 手柄 ist ungültig

我可以看到C:\Users\myapplicationpool\AppData\Local\Temp- wkhtmltopdf 正在生成 .html 文件的文件夹,例如wkhtmltopdfgn1s7k5r.html但不知何故,进展陷入停滞。

如上所述here https://github.com/incuna/django-wkhtmltopdf/issues/91 and here https://stackoverflow.com/questions/35368831/how-generate-a-pdf-file-with-django-wkhtmltopdf-on-iis-7-5-8其他人也有同样的问题。但正在改变

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

to

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+ 并且该​​文件的功能已更改。

我授予了完全权限IUSR & IIS_USRS-用户到 wkhtmltopdf-folder,其中 bin-folder 和 wkhtmltopdf.exe 所在,因为我读到这也有帮助,但事实并非如此。

问题

还有其他人知道我可以尝试什么来帮助我吗?

这个问题是否真的存在于 wkhtmltopdf 和 python 的子进程中,或者我是否必须更改/添加 IIS 中 FastCgiModule 的 djangohandler 的处理程序?我该怎么做呢?

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

Setup

我添加了 wkhtmltopdf 到INSTALLED_APPS并像这样设置它:

设置.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: 好像不可以说:“大家好”!?


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

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)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IIS 上的 django-wkhtmltopdf:[WinError 6] 句柄无效 的相关文章

随机推荐