gpt4 book ai didi

在 Docker 容器中使用 Gunicorn 运行时,Python 不解析主机(超时)(weasyprint 需要这样做)

转载 作者:行者123 更新时间:2023-12-02 18:35:40 26 4
gpt4 key购买 nike

我有一个在 docker 容器中运行的 Django 应用程序,它使用 Gunicorn 为应用程序提供服务。此应用程序使用 Wea​​syprint 生成 PDF,动态加载 CSS。此 CSS 由应用程序提供,并且工作正常(并立即加载):host_pointing_to_that_same_machine.com/dynamic_css_path.css

(它不是静态文件,它实际上是在输出 CSS 的 django URL 中定义的路径)

这是 weasyprint 代码:

css = weasyprint.CSS(url=request.build_absolute_uri(reverse('dynamic_css_path')))
response = HttpResponse(pdf.write_pdf(stylesheets=[css]), content_type='application/pdf')

这会正确创建该 URL,并且如果我使用 django 内置服务器(python manage.py runserver)而不是 gunicorn,一切都很好,无论是在我的开发机器上还是在 docker 内的远程服务器上等等。

但是当我通过 gunicorn 提供应用程序时:gunicorn project.wsgi:application --bind 0.0.0.0:8000

然后 python 无法解析主机名,我通过这样做证明了这一点:

1) 进入 docker 的应用程序控制台并尝试:

docker exec -it container_name /bin/ash
# ping host_pointing_to_that_same_machine.com
# ping any_other_host_pointing_an_external_machine.com

一切都很好。

2) 在docker容器中进入Django的控制台:

# python manage.py shell
>>> import urllib
>>> r = urllib.request.urlopen(url='http://host_pointing_to_that_same_machine.com', timeout=10)
>>> print('status: '+str(r.status))

返回 200;一切正常。

3)在docker容器中进入python的shell:

# python
>>> from urllib import request
>>> r = request.urlopen(url='http://host_pointing_to_that_same_machine.com', timeout=10)
>>> print('status: '+str(r.status))
status: 200

4) 在脚本中执行这些代码行,让 Gunicorn 为它们服务:

# docker logs container_name
Internal Server Error: /admin/app_name/path_to_pdf_generating_script/
Traceback (most recent call last):
File "/usr/local/lib/python3.6/site-packages/django/core/handlers/exception.py", line 35, in inner
response = get_response(request)
File "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py", line 128, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py", line 126, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python3.6/site-packages/django/utils/decorators.py", line 142, in _wrapped_view
response = view_func(request, *args, **kwargs)
File "/usr/local/lib/python3.6/site-packages/django/views/decorators/cache.py", line 44, in _wrapped_view_func
response = view_func(request, *args, **kwargs)
File "/usr/local/lib/python3.6/site-packages/django/contrib/admin/sites.py", line 223, in inner
return view(request, *args, **kwargs)
File "/srv/apps/project/admin/PdfMakingAdmin.py", line 125, in method_called_by_the_view
timeout=10)
File "/usr/local/lib/python3.6/urllib/request.py", line 223, in urlopen
return opener.open(url, data, timeout)
File "/usr/local/lib/python3.6/urllib/request.py", line 526, in open
response = self._open(req, data)
File "/usr/local/lib/python3.6/urllib/request.py", line 544, in _open
'_open', req)
File "/usr/local/lib/python3.6/urllib/request.py", line 504, in _call_chain
result = func(*args)
File "/usr/local/lib/python3.6/urllib/request.py", line 1346, in http_open
return self.do_open(http.client.HTTPConnection, req)
File "/usr/local/lib/python3.6/urllib/request.py", line 1321, in do_open
r = h.getresponse()
File "/usr/local/lib/python3.6/http/client.py", line 1331, in getresponse
response.begin()
File "/usr/local/lib/python3.6/http/client.py", line 297, in begin
version, status, reason = self._read_status()
File "/usr/local/lib/python3.6/http/client.py", line 258, in _read_status
line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
File "/usr/local/lib/python3.6/socket.py", line 586, in readinto
return self._sock.recv_into(b)
socket.timeout: timed out

但是如果我更改代码而不是 host_pointing_to_that_same_machine.com 尝试加载任何未指向该机器的域,例如 http://example.com或任何东西:

# docker logs container_name
status: 200

我正在尝试其他数千种方法中的任何一种来实现我想要的结果,但这仍然困扰着我,我想知道这个问题和潜在的答案是否对其他面临这个问题的人有用,他们是否正在尝试使用 Wea​​syprint 或任何其他需要进行 http 查询的脚本。

我在这里留下了 weasyprint 在尝试原始代码时抛出的完整回溯:

Environment:


Request Method: GET
Request URL: http://host_pointing_to_that_same_machine.com/admin/path-to-app/

Django Version: 2.0
Python Version: 3.6.8

Traceback:

File "/usr/local/lib/python3.6/site-packages/weasyprint/urls.py" in fetch
284. result = url_fetcher(url)

File "/usr/local/lib/python3.6/site-packages/weasyprint/urls.py" in default_url_fetcher
248. timeout=timeout, context=ssl_context)

File "/usr/local/lib/python3.6/urllib/request.py" in urlopen
223. return opener.open(url, data, timeout)

File "/usr/local/lib/python3.6/urllib/request.py" in open
526. response = self._open(req, data)

File "/usr/local/lib/python3.6/urllib/request.py" in _open
544. '_open', req)

File "/usr/local/lib/python3.6/urllib/request.py" in _call_chain
504. result = func(*args)

File "/usr/local/lib/python3.6/urllib/request.py" in http_open
1346. return self.do_open(http.client.HTTPConnection, req)

File "/usr/local/lib/python3.6/urllib/request.py" in do_open
1321. r = h.getresponse()

File "/usr/local/lib/python3.6/http/client.py" in getresponse
1331. response.begin()

File "/usr/local/lib/python3.6/http/client.py" in begin
297. version, status, reason = self._read_status()

File "/usr/local/lib/python3.6/http/client.py" in _read_status
258. line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")

File "/usr/local/lib/python3.6/socket.py" in readinto
586. return self._sock.recv_into(b)

During handling of the above exception (timed out), another exception occurred:

File "/usr/local/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner
35. response = get_response(request)

File "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
128. response = self.process_exception_by_middleware(e, request)

File "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
126. response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/usr/local/lib/python3.6/site-packages/django/utils/decorators.py" in _wrapped_view
142. response = view_func(request, *args, **kwargs)

File "/usr/local/lib/python3.6/site-packages/django/views/decorators/cache.py" in _wrapped_view_func
44. response = view_func(request, *args, **kwargs)

File "/usr/local/lib/python3.6/site-packages/django/contrib/admin/sites.py" in inner
223. return view(request, *args, **kwargs)

File "/srv/apps/app_name/admin/PdfAdmin.py" in attendee_list
134. css = weasyprint.CSS(url=request.build_absolute_uri(reverse('view_to_dynamic_css')))

File "/usr/local/lib/python3.6/site-packages/weasyprint/__init__.py" in __init__
322. with result as (source_type, source, base_url, protocol_encoding):

File "/usr/local/lib/python3.6/contextlib.py" in __enter__
81. return next(self.gen)

File "/usr/local/lib/python3.6/site-packages/weasyprint/__init__.py" in _select_source
407. with fetch(url_fetcher, url) as result:

File "/usr/local/lib/python3.6/contextlib.py" in __enter__
81. return next(self.gen)

File "/usr/local/lib/python3.6/site-packages/weasyprint/urls.py" in fetch
286. raise URLFetchingError('%s: %s' % (type(exc).__name__, str(exc)))

Exception Type: URLFetchingError at /admin/app_name/path-to-pdf-generator/
Exception Value: timeout: timed out

最佳答案

在示例中,您正在点击 http://host_pointing_to_that_same_machine.com但在错误日志中,我看到您正在尝试点击 http://host_pointing_to_that_same_machine.com/admin/path-to-app/

关于在 Docker 容器中使用 Gunicorn 运行时,Python 不解析主机(超时)(weasyprint 需要这样做),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57961404/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com