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"
}
###
GET {{server}}/upload/zip
Authorization: Bearer {{token}}
###
POST {{server}}/upload/zip/
Authorization: Bearer {{token}}

View File

@ -1,26 +1,46 @@
from django.views.decorators.csrf import csrf_exempt
from django.http import JsonResponse
from django.http import HttpResponse
from rest_framework.decorators import action
from django.db import connection
import tempfile
import threading
import time
import shutil
import logging
import zipfile
import os
import csv
import redis
@csrf_exempt
@action(detail=False, methods=['post'])
@action(detail=False, methods=['get','post'])
def upload_zip(request):
if request.method == 'POST':
filezip = request.FILES['filezip']
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)
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'):
# Notificar a Redis que proceso ha iniciado
r.set('filezip', filezip.name)
hilo = threading.Thread(target=procesa_zip, args=(filezip,))
hilo.start()
return JsonResponse({
@ -33,9 +53,11 @@ def upload_zip(request):
'message': 'Error en archivo zip enviado'
})
def procesa_zip(file_upload):
carpeta_destino = tempfile.gettempdir()
# shutil.copy(filezip.temporary_file_path(), carpeta_destino)
# descomprimir archivo zip
archivo_zip = zipfile.ZipFile(file_upload.temporary_file_path(), "r")
@ -72,13 +94,15 @@ def procesa_zip(file_upload):
cur.close()
connection.commit()
# for i in range(10):
# time.sleep(1)
# print('.', end='', flush=True)
print('==============', 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