Retrieving images from GridFS using django-tastypie-mongoengine

前提是你 提交于 2019-12-24 03:42:48

问题


I have a project in Django, and I'm using mongoengine to save images into a Mongo database using GridFSStorage.

All ok so far, but the problem is... when trying to retrieve the images via http request, with a REST API made with django-tastypie-mongoengine, I get back a json object like this:

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

Does anybody know how could I get the file from GridFS via http request?

Many thanks!


回答1:


You'll need to write your own view, but you can make it seem like it's part of the API. First, the view:

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

Then, you can map it in your urls.py:

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

And to make sure tastypie shows what you want in the output:

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

Just make sure the fake API view appears ahead of your actual API definitions, and you should be all set!




回答2:


Paul's hint was very useful. Here i have implemented this completely in tastypie manner for uploading and downloading images.

Here you go..

1. Overriding deseriazer to support '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. Model class

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. Resource class

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 this will be very useful for everyone in future. :)



来源:https://stackoverflow.com/questions/16323384/retrieving-images-from-gridfs-using-django-tastypie-mongoengine

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!