Обрабатывать POST-запрос в DJANGO
Я новичок в DJANGO, и в настоящее время я работаю над проектом, в котором я загружаю файл через страницу react на серверную часть, обрабатываемую фреймворком DJANGO REST, после получения файла я должен выполнить некоторую обработку данных.
После некоторых исследований я обнаружил, что эта логика должна быть в views.py. Итак, как мне создать функцию, которая выполняет эту обработку, и как мне вызывать ее всякий раз, когда сервер получает новый файл или был сделан запрос POST.
views.py
from .models import FileStorage
from rest_framework import viewsets
from .serializers import FilesSerializer
class FileViewSet(viewsets.ModelViewSet):
queryset = FileStorage.objects.all()
serializer_class = FilesSerializer
Вы можете переопределить методы в вашем ViewSet, чтобы добавить пользовательскую логику обработки. Это можно сделать следующим образом:
from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework import status
from .serializers import FilesSerializer
class FileViewSet(viewsets.ModelViewSet):
queryset = FileStorage.objects.all()
serializer_class = FilesSerializer
def perform_create(self, serializer):
# Access the uploaded file before saving
uploaded_file = self.request.FILES.get('file')
# Process the file
processed_data = self.process_file_before_save(uploaded_file)
# Save with additional processed data
if processed_data:
serializer.save(**processed_data)
else:
serializer.save()
def process_file_before_save(self, uploaded_file):
# Your processing logic here
# Return dict of additional fields to save
return {'processed_at': timezone.now()}
# If you don't want to save it just process
@action(detail=False, methods=['post'])
def process_file(self, request):
uploaded_file = request.FILES.get('file')
if not uploaded_file:
return Response(
{'error': 'No file provided'},
status=status.HTTP_400_BAD_REQUEST
)
try:
result = self.some_process_method(uploaded_file)
return Response({
'message': 'File processed successfully',
'filename': uploaded_file.name,
'size': uploaded_file.size,
'results': result
}, status=status.HTTP_200_OK)
except Exception as e:
return Response(
{'error': f'Processing failed: {str(e)}'},
status=status.HTTP_400_BAD_REQUEST
)