2017-07-04 2 views
0

Ich versuche, ein Datei-Upload-System in Django Rest Framework arbeiten zu lassen.Serialisierung von hochgeladenen Dateidaten Django Rest Framework

Die Dateien, die ich hochladen möchte, sind .gpx-Dateien, die benutzerdefinierte XML-Dateien sind. Ich möchte die Dateien nicht in der Datenbank speichern, sondern möchte Informationen aus ihnen extrahieren und diese dann in mein Modell eingeben.

Ich habe eine Funktion, die eine temporäre Datei und extrahiert dann die Informationen und erstellt dann die Modellelemente nach Bedarf. Ich möchte die Datei überprüfen, bevor sie hochgeladen und an diese Funktion übergeben wird.

Wie soll ich das tun?

Der Datei-Upload erfolgt derzeit wie in der Dokumentation (siehe unten), die eine generische APIView und einen Put-Befehl enthält. Das funktioniert einwandfrei. Ich möchte nur wissen, wie die Gültigkeit dieser Datei vor dem Hochladen überprüft werden kann.

views.py

class FileUploadView(views.APIView): 
    parser_classes = (FileUploadParser,) 

    def put(self, request, filename, format=None): 
     up_file = request.data['file'] 

     SaveGPXtoModel(up_file, request.user) 

     return Response(status=204) 

Sollte die API tun, um diese Kontrollen oder sollte es die Datei übernehmen bereits validiert?

In Django würden diese Prüfungen durch das Formular behandelt werden, sollte ich einen Serializer verwenden, um diese Prüfungen durchzuführen?

Wenn ein Serialisierer der Weg ist, ist es dann wichtig, dass es eine Datei als Eingabe und verschiedene Datenpunkte als Ausgabe gibt?

+0

Benutzereingaben immer explizit validieren. –

+0

Und nicht auf die Dateierweiterung entweder verlassen. Es wäre zu einfach, etwas Schädliches in '.gpx' zu ändern –

Antwort

0

Sie durch das Schreiben eines Serializer für Ihre Datei starten, es muss nicht zu einem Modell verknüpft werden:

class FileSerializer(serializers.Serializer): 
    file = serializers.FileField() 

Aber fileField führt keine spezifische Prüfung. Je nachdem, was Sie überprüfen müssen, fügen Sie einen benutzerdefinierten Validator und verwenden:

class FileSerializer(serializers.Serializer): 
    file = serializers.FileField(validators=[validate_file]) 

Es ist ein schönes Beispiel dafür, wie man eine Klasse-basierte Datei-Validator schreiben konnte here

Dann wird Ihr Serializer in Ihrer Ansicht verwenden:

class FileUploadView(APIView): 
    parser_classes = (MultiPartParser,) 

    def post(self, request): 
     serializer = FileSerializer(data=request.data) 
     if not serializer.is_valid(): 
      return Response(
       data=serializer.errors, 
       status=status.HTTP_400_BAD_REQUEST 
      ) 
     ... 
Verwandte Themen