Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

583
Visualizações
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 )
over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

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)
over 4 years ago · Santiago Trujillo Relatório

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)
over 4 years ago · Santiago Trujillo Relatório

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 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$ =)

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda