2017-07-04 13 views
0

Django Rest Frameworkで動作するファイルアップロードシステムを取得しようとしています。アップロードされたファイルデータをシリアライズするDjango Rest Framework

アップロードしたいファイルは、カスタムXMLファイルである.gpxファイルです。私はデータベースにファイルを格納したくないのではなく、それらから情報を抽出し、それを私のモデルに入力したいと思います。

私は一時ファイルを取得して情報を抽出し、必要に応じてモデル要素を作成する関数を持っています。私が探しているのは、アップロードされてこの関数に渡される前に、ファイルのチェックをいくつか実行することです。

どうすればよいですか?

ファイルのアップロードは、一般的なAPIViewとputコマンドのドキュメント(下記参照)のように現在行われています。これは完全に動作します。アップロードする前にこのファイルの有効性を確認するのが最善の方法を知りたいだけです。

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) 

APIは、これらのチェックを行うべきか、それがファイルが既に検証されていると仮定すべきか?

Djangoでは、シリアライザを使用してこれらのチェックを行うと、これらのチェックはフォームによって処理されますか?

シリアライザを使用すると、1つのファイルが入力として存在し、さまざまなデータポイントが出力として重要なのでしょうか?

+0

ユーザー入力を常に明示的に検証します。 –

+0

また、ファイル拡張子にも依存しないでください。悪質なものを '.gpx'に変更するのは簡単すぎるでしょう。 –

答えて

0

あなたはあなたのファイルのためのシリアライザを書くことで起動することができ、それがモデルにリンクする必要はありません。

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

しかしfileFieldは、任意の特定のチェックを行いません。あなたがチェックする必要がある内容に応じて、カスタムバリデータを追加して使用します。あなたはhere

は、その後、あなたのビューであなたのシリアライザを使用し、クラスベースのファイルバリデータを書き込むことができる方法の良い例があり

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

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 
      ) 
     ... 
関連する問題