Код: Выделить всё
postgresql 14В полученном PDF-файле отсутствует содержимое, поэтому сравнения выходного размера достаточно, чтобы определить, что возникла ошибка:
Код: Выделить всё
# call as: python3 manage.py minrepro input.pdf
import argparse, io
from django.core.management.base import BaseCommand
from pypdf import PdfReader, PdfWriter
from djangoapp.models import DjangoModel
def main(fin):
pdfout = PdfWriter()
pageout = pdfout.add_blank_page(width=200, height=200)
for i in range(8):
# Note: accessing the database *during* PDF merging is relevant!
# without the next line, the problem cannot be reproduced
for c in range(31): a = DjangoModel.objects.first()
fin.seek(0)
for pagein in PdfReader(fin, strict=True).pages:
pageout.merge_page(pagein)
with io.BytesIO() as fout:
pdfout.write(fout)
return fout.tell()
class Command(BaseCommand):
def add_arguments(self, parser):
parser.add_argument(dest="pdf", type=argparse.FileType("rb") )
def handle(self, *args, **options):
for i in range(30):
if i == 0: first_size = main(options["pdf"])
current_size = main(options["pdf"])
if not first_size == current_size:
print(f"presumed stateless call was not {i=}, {first_size=} != {current_size=}")
- Моя первая теория заключалась в том, что pyPDF не может генерировать действительно уникальные имена для повторяющихся идентификаторов (после слияния), а доступ к БД просто дает возможность (задержку) для чтобы стать заметным. Я искал импорт в любое время или случайный в соответствующих библиотеках, явных ошибок там не было. Кроме того, ничто вроде time.sleep(0.02) не могло заставить мой воспроизводитель работать, только доступ к базе данных.
- Это CPython с упорядоченными по вставке словарями, большая часть кода должна вести себя то же самое на одинаковом входе. Также называется python с -W модулем::ResourceWarning -W модулем::DeprecationWarning -W модулем::PendingDeprecationWarning, чтобы с большей вероятностью получать уведомления о любых ошибках с моей стороны, ничего.
- Поведение было воспроизведено с помощью однопоточной команды управления, поэтому оно не связано с какой-либо проблемой http/веб-сервера.
Подробнее здесь: https://stackoverflow.com/questions/781 ... in-between