Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

434
Views
Django/reportlab: guarde el pdf generado directamente en FileField en AWS s3

Estoy escribiendo una aplicación Django, para la cual necesito generar un PDF, usar reportlab y guardarlo en un FileField . Mi problema es que mis medios están almacenados en S3 y no sé cómo guardar este pdf directamente en S3.

Estoy creando el pdf localmente, luego lo leo y lo guardo en FileField en s3, luego elimino la versión local, pero me pregunto si hay una solución mejor, donde puedo guardar el archivo directamente en S3.

Así es como genero el contrato ahora:

 #temporary folder name to generate contract locally folder_name = ( '/tmp/' + '/contracts/' + gig.identifier ) mkdir_p(folder_name) address = ( folder_name + '/contract_' + lang + '.pdf' ) doc = SimpleDocTemplate( address, pagesize=A4, rightMargin=72, leftMargin=72, topMargin=120, bottomMargin=18 ) doc.build(Story, canvasmaker=LogoCanvas) local_file = open(address) pdf_file = File(local_file) contract = Contract.objects.create(lang=lang, gig=gig) contract.contract_file.save('contract_'+lang+'.pdf', pdf_file) contract.save() #remove temporary folder shutil.rmtree(folder_name) return True

y el modelo de contrato se define así:

 class Contract(models.Model): gig = models.ForeignKey(Gig, related_name='contracts') lang = models.CharField(max_length=10, default='') contract_file = models.FileField( upload_to=get_contract_path, blank=True, null=True, default=None )
about 4 years ago · Santiago Trujillo
3 answers
Answer question

0

Puede guardar los archivos PDF generados directamente en S3.

Uso la biblioteca boto3 para encargarme del almacenamiento en s3 y creo que está utilizando el mismo enfoque.

 from api.models import Entity from django.core.files.base import ContentFile entity = Entity.objects.create(**create_params) pdf = render_to_pdf('invoice.html') # returns BytesIO entity.pdf_field.save('invoice.pdf', ContentFile(pdf.getvalue()), save=True)
about 4 years ago · Santiago Trujillo Report

0

Puede usar BytesIO para crear un flujo en memoria en lugar de un flujo de archivos.

Sin embargo, aún debe hacer que Reportlab use esa transmisión en lugar de un archivo.

Basándose en la guía del usuario, en 2.2 Más sobre Canvas, el constructor de Canvas tiene un parámetro de nombre de filename que puede ser tanto una cadena como un descriptor de archivo. Lo he probado con SimpleDocTemplate , por lo que debería funcionar para usted:

 import io stream = io.BytesIO() doc = SimpleDocTemplate( stream, pagesize=A4, rightMargin=72, leftMargin=72, topMargin=120, bottomMargin=18 ) doc.build(Story, canvasmaker=LogoCanvas) pdf_buffer = stream.getBuffer()

No sé S3, pero estoy seguro de que esto es suficiente para resolver su problema. Por ejemplo, si ahora quisiera escribir este pdf en un archivo, haría lo siguiente:

 file = open("contract.pdf", "wb") file.write(pdf_buffer)
about 4 years ago · Santiago Trujillo Report

0

Puede usar el tempfile del módulo Python estándar ( import tempfile )

 tempfile.TemporaryFile(mode='w+b', buffering=None, encoding=None, newline=None, suffix=None, prefix=None, dir=None)

Devuelve un objeto similar a un archivo que se puede usar como área de almacenamiento temporal. El archivo se crea de forma segura, utilizando las mismas reglas que mkstemp(). Se destruirá tan pronto como se cierre (incluido un cierre implícito cuando el objeto se recolecte como basura). En Unix, la entrada de directorio para el archivo no se crea en absoluto o se elimina inmediatamente después de que se crea el archivo. Otras plataformas no admiten esto; su código no debe basarse en un archivo temporal creado con esta función que tenga o no tenga un nombre visible en el sistema de archivos.

https://docs.python.org/3/library/tempfile.html Su uso del objeto tempfile es absolutamente similar al archivo normal.

Por cierto me debes 25$ =)

about 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!