当前位置: 首页 > 知识库问答 >
问题:

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

程修雅
2023-03-14

这是我的第一个问题,所以请原谅我,如果我忘了说什么或者有什么问题的话:)

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

只有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文件。

当我将<code>ALLOWED_HOSTS</code>更改为服务器的IP并调用url生成pdf时,它表示有一个

OSError在 /pdf/

[赢错误6]句柄无效

通过追溯:

inner 34中的文件“C:\ my _ project \ myenv \ lib \ site-packages \ django \ core \ handlers \ exception . py”。响应= get_response(请求)

文件“C:\ my _ project \ myenv \ lib \ site-packages \ django \ core \ handlers \ base . py”in _ get _ response 156。response = self . process _ exception _ by _ middleware(e,请求)

文件“C:\ my _ project \ myenv \ lib \ site-packages \ django \ core \ handlers \ base . py”in _ get _ response 154。response = response.render()

render 106中的文件“C:\ my _ project \ myenv \ lib \ site-packages \ django \ template \ response . py”。self . content = self . rendered _ content

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

文件"C:\my_project\myenv\lib\site-pack\wkhtmltopdf\utils.py"在render_pdf_from_template237.cover_filename=cover.filename如果覆盖其他无)

文件"C:\my_project\myenv\lib\site-pack\wkhtmltopdf\utils.py"在convert_to_pdf166.返回wkhtmltopdf(页面=页面,**cmd_options)

wkhtmltopdf 147中的文件“C:\ my _ project \ myenv \ lib \ site-packages \ wkhtmltopdf \ utils . py”。返回check_output(ck_args,**ck_kwargs)

check_output 316中的文件“C:\ Program Files \ python 35 \ lib \ subprocess . py”。* *夸脱)。标准输出

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

文件"C:\Program Files\Python35\lib\subprocess.py"在init 640. errread, errwrite)=self._get_handles(stdin, stdout, stderr)

_get_handles 884 中的文件“C:\程序文件\Python35\lib\subprocess.py”。错误写入 = _winapi。GetStdHandle(_winapi.STD_ERROR_HANDLE)

异常类型:OSError at/pdf/异常值:[WinError 6]Das Handle ist ungültig

我可以看到在C:\User\myappationpool\AppData\Local\Temp-文件夹中,wkhtmltopdf正在生成一个. html-文件,称为例如wkhtmltopdfgn1s7k5r.html,但不知何故进度被卡住了。

正如这里和这里提到的,其他人也有同样的问题。但是正在改变

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)

没有效果。我认为这个解决方案只适用于子流程。py文件,我使用的是Python 3,该文件的功能已更改。

我授予了IUSR的完全权限

有人知道我能做些什么来帮助我吗?

这个问题真的存在于wkhtmltopdf的子流程中吗

为什么当我在本地服务器上运行它时,它localhost没有任何问题,但当我通过服务器的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

我的视野.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个答案

岳嘉容
2023-03-14

要执行与 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)

 类似资料:
  • 我使用django wkhtmltopdf在我的webapp中生成pdf,使用djang o集成服务器可以正常工作,但当我使用IIS 7.5或8时,会出现以下错误:WindowsError[error 6]句柄无效 环境:

  • 问题内容: 我正在尝试自己学习编程,但仍在尝试掌握它。我收到以下错误: java.io.IOException:句柄无效 这是我的代码 我相信,每当我调用该方法时,都会出现错误,当我尝试显示默认构造函数中的字节数时,它可以很好地工作并显示。 问题答案: 好了,在实际开始使用它之前,请先关闭构造函数的块。将结束部分从构造函数中移到完成后将被调用的位置,例如在main 下方调用或单独的close方法。

  • 在书写代码与阅读代码的时候,经常会看到这一句代码: typedef void *HANDLE ,它是何方神圣呢?如何理解呢? 不理解它的时候,感觉它很神奇,知道它以后,它就是个typedef的定义,只不过是void*类型罢了,也就是HANDLE等价于void *,我们可以叫它披着句柄皮的指针(PS:指针和句柄是有区别的,在这说句废话); 对于void* 神通广大,因为它作为函数参数or函数返回值,

  • 你可以创建任何MATLAB函数的句柄,然后用这些句柄作为函数链接的途径。函数句柄主要用来传递自变量列表给其他函数,用句柄执行函数或求值。 在MATLAB中,通过在函数名前加上符号@构造函数句柄。下面例子为SIN函数创建一个函数句柄,然后赋值给变量fhandle: fhandle = @sin; 用MATLAB的fevel函数对函数句柄求值。下面的plot_fhandle函数接收一个函数句柄和数据

  • 我试图用这个库创建一个pdf,实现最简单的de docs示例 使用url并直接从模板中呈现,如下所示 这是模板文件的 html 但是当我尝试访问url时,错误是这样的 /pdf/“NoneType”对象处的AttributeError没有属性“endswith” 我如何能修理它 这是回溯 回溯:get_response139.response=response中的文件“/usr/local/lib

  • 当你用作图命令时,MATLAB用多种图形对象创建图形,例如线,文本,表面(完整列表见Graphics Objects)。所有图形对象都有控制其性能的属性。你可以在MATLAB中询问每种属性的取值并设置大部分的属性值。 每当MATLAB创建一个图形对象时,它就给该对象赋以一个标识符(称为句柄)。可以用此句柄访问对象属性。若你想作下列操作,句柄图形很有用。 修改图形外观。 通过编写能直接创建和操作对象