Я пытаюсь прикрепить PDF-файл к электронному письму в Django. PDF отображается из HTML-представления с использованием xhtml2pdf.
Сценарий вызывается каждый день из Heroku с помощью приложения планировщика. Эта часть работает нормально.
Проблема, с которой я сталкиваюсь, заключается в том, чтобы заставить pdf-файл присоединяться к электронному письму при вызове из сценария управления / команд в Django.
Или реальный вопрос в том, как извлечь pdf из представления без вызова PDFReport.as_view (), поскольку это не файл в байтах, а функция рендеринга.
urls.py
path('pdf_report/', PDFReport.as_view(), name="Pdf_report"),
views.py
class PDFReport(View):
def get(self, request, airport_code=None, date_code=None, shift_code=None):
dates = get_perf_dates(date_code)
# Render the resulting json data
params = {'p_table': p_table,
"airportcode": airport_code,
"perfdates": dates,
"shift": shift_code
}
return Render.render('pdf_report.html', params)
render.py
class Render:
@staticmethod
def render(path: str, params: dict):
template = get_template(path)
html = template.render(params)
response = BytesIO()
pdf = x_pisa.pisaDocument(BytesIO(html.encode("UTF-8")), response)
if not pdf.err:
return HttpResponse(response.getvalue(), content_type='application/pdf')
else:
return HttpResponse("Error Rendering PDF", status=400)
и, наконец, часть автоматизированного скрипта (в управлении / командах)
Send_PDF.py
from django.core.management.base import BaseCommand
from django.core.mail import EmailMessage
from ...views import PDFReport
from ...models import DistributionList
class Command(BaseCommand):
help = "Sends out an email when called"
def handle(self, *args, **options):
'''Contact page view for technical support requests'''
mail_d_list = []
for users in DistributionList.objects.all(): #.values_list('email', flat=True)
mail_d_list.append(users.email)
mail_name.append(users.name)
self.stdout.write(str(mail_d_list)) # For testing purposes
mail_subject = "Daily Report"
mail_content = "This is an automated message."
mail_from = 'XXX@gmail.com'
mail_attachment = PDFReport.as_view()
email = EmailMessage(mail_subject,
mail_content,
mail_from,
mail_d_list,
)
email.attach('report.pdf', mail_attachment, 'application/pdf')
email.send()
Возвращает
TypeError: ожидаемый байтовидный объект, а не функция