2013-05-01 3 views
2

J'ai un projet dans Django, et j'utilise mongoengine pour enregistrer des images dans une base de données Mongo en utilisant GridFSStorage.Récupérer des images de GridFS en utilisant django-tastypie-mongoengine

Tout ok jusqu'à présent, mais le problème est ... lorsque vous essayez de récupérer les images via requête http, avec une API REST fait avec django-tastypie-mongoengine, je reviens un objet JSON comme ceci:

{"file": "<GridFSProxy: 516ed7cf56ba7d01eb09f522>", "id": "516ed7cf56ba7d01eb09f524", "resource_uri": "/api/v1/pic/516ed7cf56ba7d01eb09f524/"} 

Est-ce que quelqu'un sait comment pourrais-je obtenir le fichier de GridFS via la requête http?

Merci beaucoup!

Répondre

1

Vous devez écrire votre propre vue, mais vous pouvez donner l'impression qu'elle fait partie de l'API. Tout d'abord, la vue:

def api_image(pk): 
    obj = get_object_or_404(Model, pk=pk) 
    image_file = obj.file 
    return Response(image_file.read(), 
     mime_type='image/png') # or whatever the MIME type is 

Ensuite, vous pouvez mapper dans votre urls.py:

url('^/api/v1/pic/(?P<pk>\w+)/file/$', api_image) 

Et pour tastypie vous montre ce que vous voulez dans la sortie:

def dehydrate_file(self, bundle): 
    return '/api/v1/pic/%s/file/' % (bundle.obj.id) 

Juste assurez-vous que la fausse vue de l'API apparaît avant vos définitions d'API réelles, et vous devriez être tous ensemble!

+0

C'est vraiment utile. La réponse doit être acceptée. – CrazyGeek

0

L'indice de Paul était très utile. Ici, je l'ai mis en œuvre complètement de manière tastypie pour télécharger et télécharger des images.

Ici, vous allez ..

1. Redéfinition deseriazer pour soutenir 'multipart'.

class MultipartResource(object): 
def deserialize(self, request, data, format=None): 
    if not format: 
     format = request.META.get('CONTENT_TYPE', 'application/json') 
    if format == 'application/x-www-form-urlencoded': 
     return request.POST 
    if format.startswith('multipart'): 
     data = request.POST.copy() 
     data.update(request.FILES) 
     return data 
    return super(MultipartResource, self).deserialize(request, data, format) 

2. Modèle de

class Research(Document): 
    user = ReferenceField(User) 
    academic_year = StringField(max_length=20) 
    subject = StringField(max_length=150) 
    topic = StringField(max_length=50) 
    pub_date = DateTimeField() 
    authored = StringField(max_length=20) 
    research_level = StringField(max_length=20) 
    paper_presented = BooleanField() 
    thesis_written = BooleanField() 
    proof_image = ImageField() 

3. classe de ressources

class ResearchResource(MultipartResource, MongoEngineResource): 

class Meta: 
    queryset = Research.objects.all() 
    list_allowed_methods = ['get','post'] 
    resource_name = 'research' 
    authentication = SessionAuthentication() 
    authorization = Authorization() 

def prepend_urls(self): 
    return [ 
     url(r"^(?P<resource_name>%s)/$" % self._meta.resource_name, 
      self.wrap_view('dispatch_list'), name="api_dispatch_list"), 

     #url to download image file. 
     url(r"^(?P<resource_name>%s)/(?P<pk>\w+)/file/$"% self._meta.resource_name, 
      self.wrap_view('get_image'), name="api_get_image"), 
    ] 

#Preparing image url dynamically 
def dehydrate_proof_image(self, bundle): 
    return '/api/v1/%s/%s/file/' % (self._meta.resource_name,bundle.obj.id) 

#view will call based on image url to download image. 
def get_image(self, request, **kwargs): 
    obj = Research.objects.get(id=kwargs['pk']) 
    image_file = obj.proof_image 
    return HttpResponse(image_file.read(), content_type="image/jpeg")) 

Hope ce sera très utile pour tout le monde à l'avenir. :)

Questions connexes