Обрабатывать 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
            )
    
Вернуться на верх