Я использую wkhtmltopdf
с Django для создания PDF-файла и отправки его кому-либо по электронной почте. Вот мой взгляд:
class ChallanEmail(AtomicMixin, View, LoginRequiredMixin):
template = "europarts/challan/email_template.html"
def get(self, request, **kwargs):
challan = Challan.objects.get(pk=kwargs['pk'])
ref_no = challan.ref_no
date = challan.created
recipient = challan.recipient
address = challan.recipient_address
challan_rows = ChallanRow.objects.filter(challan=challan)
context = {
"ref_no": ref_no,
"date": date,
"recipient": recipient,
"address": address,
"challan_rows": challan_rows,
}
response = PDFTemplateResponse(
request=request,
template=self.template,
filename='challan_email.pdf',
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},
)
file_path = os.path.join(settings.BASE_DIR, settings.MEDIA_ROOT, 'challan_email.pdf')
with open(file_path, 'wb') as f:
f.write(response.rendered_content)
subject = 'From Design Ace Limited'
body = self.request.GET.get('email_body', '')
from_email = 'Sorower Hossain <sorower@europartsbd.com>'
to = ['{}'.format(self.request.GET.get('to_address'))]
attachment = os.path.join(settings.MEDIA_ROOT, 'challan_email.pdf')
send_email(subject, body, from_email, to, attachment)
return HttpResponseRedirect(reverse('europarts:challan_details', args=(kwargs['pk'],)))
Как вы можете видеть в конце, я отправляю электронное письмо с заданием (send_email
), используя celery
. Однако наиболее трудоемким процессом является процесс создания PDF. Вот часть кода, которая делает это:
response = PDFTemplateResponse(
request=request,
template=self.template,
filename='challan_email.pdf',
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},
)
Проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда я пытаюсь передать все параметры в задачу сельдерея, выдается ошибка, поскольку request
не сериализуем. Как я могу перенести запрос в свою задачу сельдерея и сэкономить время при создании PDF? Эта задача занимает почти три секунды, что очень много.