这是我的第一个问题,因此,如果我忘了提什么或它有问题,请原谅我:)
我在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文件,但进度却被卡住了。
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+,并且此文件的功能已更改。
我向IUSR
和IIS_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: 看来我不允许说:“大家好”!?
答案 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)