Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Manejo de archivos grandes con una Django app &...

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest. →

Manejo de archivos grandes con una Django app & DRF

Avatar for Emiliano Martin

Emiliano Martin

August 13, 2020

Other Decks in Programming

Transcript

  1. Manejo de archivos grandes con una Django app & DRF

    Agosto 2020 Emiliano Martín Software Engineer
  2. Sobre mí ❖ Argentino. ❖ Esposo y padre. ❖ Ingeniero

    en Sistemas de Información. ❖ Software Engineer en Mercadolibre +5 años. ❖ Apasionado del desarrollo de software.
  3. Agenda • Problemática • Diferentes approach REST • Caso de

    uso • Configurando nuestra app en producción ◦ Storage ◦ Uploaded Files and Upload Handlers ◦ Fine tuning Ngnix & uWsgi.
  4. Diferentes approach REST ❏ Datos y archivo en un mismo

    request (Multipart) ❏ Datos y archivo en diferentes requests ❏ Datos y archivo en un mismo request (Multipart + JSON)
  5. class Message(models.Model): description = models.TextField() active = models.BooleanField(default=False) attachment =

    models.FileField(upload_to="/tmp/") Datos y archivo en un mismo request class MessageSerializer(serializers.ModelSerializer): class Meta: model = Message fields = ["description", "active", "picture"]
  6. Datos y archivo en un mismo request class MessageView(generics.CreateAPIView): parser_classes

    = [parsers.MultiPartParser] serializer_class = MessageSerializer def create(self, request, *args, **kwargs): serializer = self.getserializer(data=request.data) # request.data[“attachment”] serializer.is_valid(raise_exception=True) serializer.save() return response.Response( serializer.data, status=status.HTTP_201_CREATED )
  7. Configurando tu propio storage class Message(models.Model): description = models.TextField() active

    = models.BooleanField(default=False) attachment = models.FileField( storage=MyStorage(), upload_to="/tmp/" ) • https:/ /docs.djangoproject.com/en/3.0/ref/settings/#default-file-storage
  8. Configurando tu propio storage • _open() • _save() • delete()

    • exists() • listdir() • size() • url() • https:/ /docs.djangoproject.com/en/3.1/howto/custom-file-storage/ • https:/ /django-storages.readthedocs.io/en/latest/index.html
  9. Revisando nuestra view class MessageView(generics.CreateAPIView): parser_classes = [parsers.MultiPartParser] serializer_class =

    MessageSerializer def create(self, request, *args, **kwargs): serializer = self.getserializer(data=request.data) # request.data[“attachment”] serializer.is_valid(raise_exception=True) serializer.save() return response.Response( serializer.data, status=status.HTTP_201_CREATED )
  10. Uploaded Files and Upload Handlers ❏ TemporaryUploadedFile -> TemporaryFileUploadHandler ❏

    InMemoryUploadedFile -> MemoryFileUploadHandler • https:/ /docs.djangoproject.com/en/3.0/ref/settings/#std:setting-FILE_UPLOAD_MAX_MEMORY_SIZE • https:/ /docs.djangoproject.com/en/3.0/ref/settings/#std:setting-FILE_UPLOAD_HANDLERS • https:/ /docs.djangoproject.com/en/3.1/ref/files/uploads/#writing-custom-upload-handlers ➔ FILE_UPLOAD_MAX_MEMORY_SIZE ◆ Default: 2621440 (i.e. 2.5 MB). ➔ FILE_UPLOAD_HANDLER ◆ Default: [ 'django.core.files.uploadhandler.MemoryFileUploadHandler', 'django.core.files.uploadhandler.TemporaryFileUploadHandler', ]
  11. Configurando servidor de aplicaciones • uWSGI ◦ uwsgi.ini post-buffering =

    true limit-post = 17179869184 http-timeout = 1200 harakiri = 1200 • https:/ /uwsgi-docs.readthedocs.io/en/latest/ThingsToKnow.html • https:/ /uwsgi-docs.readthedocs.io/en/latest/Fastrouter.html#post-buffering-mode-uwsgi-2-0-9 • https:/ /uwsgi-docs.readthedocs.io/en/latest/Options.html?highlight=options
  12. Conclusiones • Definir volumen y tamaño de archivos. • Aprovechar

    artefactos y no reinventar. • Tener en cuenta visión general de arquitectura. ◦ Configuraciones • Iterar...