se notifica a redis que se inicio proceso de archivo zip

francisco/photos
Francisco Sandoval 2024-01-13 15:09:24 -03:00
parent edb2e21927
commit d35e135565
2 changed files with 39 additions and 10 deletions

View File

@ -12,6 +12,11 @@ Content-Type: application/json
"password": "usuario1" "password": "usuario1"
} }
###
GET {{server}}/upload/zip
Authorization: Bearer {{token}}
### ###
POST {{server}}/upload/zip/ POST {{server}}/upload/zip/
Authorization: Bearer {{token}} Authorization: Bearer {{token}}

View File

@ -1,26 +1,46 @@
from django.views.decorators.csrf import csrf_exempt from django.views.decorators.csrf import csrf_exempt
from django.http import JsonResponse from django.http import JsonResponse
from django.http import HttpResponse
from rest_framework.decorators import action from rest_framework.decorators import action
from django.db import connection from django.db import connection
import tempfile import tempfile
import threading import threading
import time
import shutil
import logging import logging
import zipfile import zipfile
import os import os
import csv import csv
import redis
@csrf_exempt @csrf_exempt
@action(detail=False, methods=['post']) @action(detail=False, methods=['get','post'])
def upload_zip(request): def upload_zip(request):
if request.method == 'POST': db_host = os.getenv('DB_REDIS_HOST')
filezip = request.FILES['filezip'] db_port = os.getenv('DB_REDIS_PORT')
r = redis.Redis(host=db_host, port=db_port, decode_responses=True)
if request.method == 'GET':
filezip = r.get('filezip')
return JsonResponse({
'process': filezip != None,
'filename': filezip
})
if request.method == 'POST':
status = r.get('filezip')
if status != None:
return HttpResponse('Ya existe un proceso en ejecución', status=400)
filezip = request.FILES['filezip']
if filezip.closed == False and hasattr(filezip,'temporary_file_path'): if filezip.closed == False and hasattr(filezip,'temporary_file_path'):
# Notificar a Redis que proceso ha iniciado
r.set('filezip', filezip.name)
hilo = threading.Thread(target=procesa_zip, args=(filezip,)) hilo = threading.Thread(target=procesa_zip, args=(filezip,))
hilo.start() hilo.start()
return JsonResponse({ return JsonResponse({
@ -33,9 +53,11 @@ def upload_zip(request):
'message': 'Error en archivo zip enviado' 'message': 'Error en archivo zip enviado'
}) })
def procesa_zip(file_upload): def procesa_zip(file_upload):
carpeta_destino = tempfile.gettempdir() carpeta_destino = tempfile.gettempdir()
# shutil.copy(filezip.temporary_file_path(), carpeta_destino)
# descomprimir archivo zip # descomprimir archivo zip
archivo_zip = zipfile.ZipFile(file_upload.temporary_file_path(), "r") archivo_zip = zipfile.ZipFile(file_upload.temporary_file_path(), "r")
@ -72,13 +94,15 @@ def procesa_zip(file_upload):
cur.close() cur.close()
connection.commit() connection.commit()
# for i in range(10):
# time.sleep(1)
# print('.', end='', flush=True)
print('==============', flush=True) print('==============', flush=True)
print(f'fin proceso archivo: {archivo_zip}', flush=True) print(f'fin proceso archivo: {archivo_zip}', flush=True)
# notificar a Redis que proceso ha finalizado
db_host = os.getenv('DB_REDIS_HOST')
db_port = os.getenv('DB_REDIS_PORT')
r = redis.Redis(host=db_host, port=db_port, decode_responses=True)
r.delete('filezip')
# Función para crear la definición de la tabla como texto y cargar los datos # Función para crear la definición de la tabla como texto y cargar los datos