Django REPOS Cadre + Django RESTE Swagger + ImageField

j'ai créé un modèle simple avec un champ D'image et je veux faire une vue api avec django-rest-framework + django-rest-swagger, qui est documentée et qui est capable de télécharger le fichier.

Voici ce que j'ai:

models.py

from django.utils import timezone
from django.db import models

class MyModel(models.Model):

    source = models.ImageField(upload_to=u'/photos')
    is_active = models.BooleanField(default=False)
    created_at = models.DateTimeField(default=timezone.now)

    def __unicode__(self):
        return u"photo {0}".format(self.source.url)

serializer.py

from .models import MyModel

class MyModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = MyModel
        fields = [
            'id',
            'source',
            'created_at',
        ]

views.py

from rest_framework import generics
from .serializer import MyModelSerializer

class MyModelView(generics.CreateAPIView):
    serializer_class = MyModelSerializer
    parser_classes = (FileUploadParser, )

    def post(self, *args, **kwargs):
        """
            Create a MyModel
            ---
            parameters:
                - name: source
                  description: file
                  required: True
                  type: file
            responseMessages:
                - code: 201
                  message: Created
        """
        return super(MyModelView, self).post(self, *args, **kwargs)

urls.py

from weddings.api.views import MyModelView

urlpatterns = patterns(
    '',
    url(r'^/api/mymodel/$', MyModelView.as_view()),
)

Pour moi, ce devrait être assez simple. Cependant, je ne peux pas faire fonctionner le téléchargement. J'ai toujours cette erreur de réponse: enter image description here

j'ai lu cette partie de la documentation de django-repos-cadre:

If the view used with FileUploadParser is called with a filename URL keyword argument, then that argument will be used as the filename. If it is called without a filename URL keyword argument, then the client must set the filename in the Content-Disposition HTTP header. For example Content-Disposition: attachment; filename=upload.jpg.

cependant l'en-tête est passé par django-rest-swagger dans la propriété Request Payload (de la console chrome).

Si d'info plus est nécessaire, s'il vous plaît laissez-moi savoir.

j'utilise Django==1.8.8, djangorestframework==3.3.2 et django-rest-swagger==0.3.4.

18
demandé sur coffee-grinder 2016-04-18 21:42:05

3 réponses

j'ai eu ce travail en faisant quelques changements à votre code.

tout d'Abord, dans models.py, modifiez ImageField nom file et utiliser le chemin relatif pour télécharger le dossier. Lorsque vous téléchargez un fichier en flux binaire, il est disponible en request.data dictionnaire dans un fichier de clé (request.data.get('file')), donc l'option la plus propre est de l'associer au champ model avec le même nom.

from django.utils import timezone
from django.db import models


class MyModel(models.Model):

    file = models.ImageField(upload_to=u'photos')
    is_active = models.BooleanField(default=False)
    created_at = models.DateTimeField(default=timezone.now)

    def __unicode__(self):
        return u"photo {0}".format(self.file.url)

serializer.py, renommer le champ source en fichier:

class MyModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = MyModel
        fields = ('id', 'file', 'created_at')