Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

437
Vistas
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 Respuestas
Responde la pregunta

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 Denunciar

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 Denunciar

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 Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda