Можно ли временно сохранить файл в Azure Function Linux Consuption Plan в Python? - PullRequest
1 голос
/ 05 августа 2020

в первую очередь извините за мой англ sh. У меня есть Azure Function Linux Consuption Plan с использованием Python, и мне нужно сгенерировать html, преобразовать в pdf с помощью wkhtmltopdf и отправить его по электронной почте.

 #generate temporally pdf
config = pdfkit.configuration(wkhtmltopdf="binary/wkhtmltopdf")
pdfkit.from_string(pdf_content, 'report.pdf',configuration=config, options={})

#read pdf and transform to Bytes
with open('report.pdf', 'rb') as f:
    data = f.read()

#encode bytes
encoded = base64.b64encode(data).decode()

#Send Email
EmailSendData.sendEmail(html_content,encoded,spanish_month)

Код работает нормально в моей локальной разработке, но когда я развертываю функцию и выполняю код, я получаю сообщение об ошибке:

Result: Failure Exception: OSError: wkhtmltopdf reported an error: Loading pages (1/6) [> ] 0% [======> ] 10% [==============================> ] 50% [============================================================] 100% QPainter::begin(): Returned false Error: Unable to write to destination

Я думаю, что об ошибке сообщается, потому что по какой-либо причине разрешение на запись недоступно. Вы можете помочь мне решить эту проблему?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

Окончательный правильный код:

config = pdfkit.configuration(wkhtmltopdf="binary/wkhtmltopdf")

local_path = os.path.join(tempfile.gettempdir(), 'report.pdf')
logger.info(tempfile.gettempdir())

pdfkit.from_string(pdf_content, local_path,configuration=config, options={})
0 голосов
/ 06 августа 2020

Метод tempfile.gettempdir() возвращает временную папку , которая на Linux равна /tmp. Ваше приложение может использовать этот каталог для хранения временных файлов , сгенерированных и используемых вашими функциями во время выполнения.

Поэтому используйте /tmp/report.pdf в качестве каталога файлов для сохранения временного файла.

with open('/tmp/report.pdf', 'rb') as f:
    data = f.read()

Более подробную информацию вы можете найти в этой статье .

...