Почему Celery не дает такой ошибки файла или каталога? - PullRequest
0 голосов
/ 11 мая 2018

Я создаю PDF и отправляю его по электронной почте в виде вложения.Всякий раз, когда я запускаю celery multi start worker -A erp -l info и пытаюсь отправить письмо, оно работает.Но всякий раз, когда я делаю это с демонизированным Celery, он показывает следующую ошибку:

[2018-05-11 20:53:47,131: ERROR/ForkPoolWorker-6] Task europarts.tasks.generate_pdf_and_send_email[fd80843b-647c-412e-b847-f35cbf157fae] raised unexpected: OSError(2, 'No such file or directory')
Traceback (most recent call last):
  File "/home/michel/erp/venv/lib/python2.7/site-packages/celery/app/trace.py", line 374, in trace_task
    R = retval = fun(*args, **kwargs)
  File "/home/michel/erp/venv/lib/python2.7/site-packages/celery/app/trace.py", line 629, in __protected_call__
    return self.run(*args, **kwargs)
  File "europarts/tasks.py", line 58, in generate_pdf_and_send_email
    email.attach(file_name, response.rendered_content, 'application/pdf')
  File "/home/michel/erp/venv/lib/python2.7/site-packages/wkhtmltopdf/views.py", line 78, in rendered_content
    cmd_options=cmd_options
  File "/home/michel/erp/venv/lib/python2.7/site-packages/wkhtmltopdf/utils.py", line 186, in render_pdf_from_template
    cmd_options=cmd_options)
  File "/home/michel/erp/venv/lib/python2.7/site-packages/wkhtmltopdf/utils.py", line 124, in convert_to_pdf
    return wkhtmltopdf(pages=filename, **cmd_options)
  File "/home/michel/erp/venv/lib/python2.7/site-packages/wkhtmltopdf/utils.py", line 110, in wkhtmltopdf
    return check_output(ck_args, **ck_kwargs)
  File "/usr/lib64/python2.7/subprocess.py", line 568, in check_output
    process = Popen(stdout=PIPE, *popenargs, **kwargs)
  File "/usr/lib64/python2.7/subprocess.py", line 711, in __init__
    errread, errwrite)
  File "/usr/lib64/python2.7/subprocess.py", line 1327, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

Я вижу, что в строке 58 у меня есть и ошибка в моей функции.Но эта функция не записывает файл на диск, а просто создает PDF и прикрепляет его к электронной почте перед отправкой.Вот код:

def generate_pdf_and_send_email(template, filename, context, pk, model, subject, body, from_email, to):
    request = RequestFactory().get(reverse('europarts:{model}_email'.format(model=model), args=[pk]))

    kw = {
        '{model}_id'.format(model=model): pk
    }
    row_model = '{model}Row'.format(model=model)
    rows = apps.get_model('europarts', row_model).objects.filter(**kw)
    context['{model}_rows'.format(model=model)] = rows
    file_name = '{model}_email.pdf'.format(model=model)

    response = PDFTemplateResponse(
        request=request,
        template=template,
        filename=filename,
        context=context,
        show_content_in_browser=True,
        cmd_options={'margin-top': 10,
                     'zoom': 1,
                     'viewport-size': '1366 x 513',
                     'javascript-delay': 1000,
                     'no-stop-slow-scripts': True},
    )

    email = EmailMessage()
    email.subject = subject
    email.body = body
    email.from_email = from_email
    email.to = to
    email.attach(file_name, response.rendered_content, 'application/pdf')

    email.send()

    return response

Что я могу делать не так?

1 Ответ

0 голосов
/ 13 мая 2018

Моя проблема была решена путем определения места установки wkhtmltopdf:

$ which wkhtmltopdf
/usr/local/bin/wkhtmltopdf

И поместить это место в settings.py:

WKHTMLTOPDF_CMD = '/usr/local/bin/wkhtmltopdf'
...