2

我在 Django 中有一个项目,我正在使用 mongoengine 使用 GridFSStorage 将图像保存到 Mongo 数据库中。

到目前为止一切正常,但问题是......当尝试通过 http 请求检索图像时,使用 django-tastypie-mongoengine 制作的 REST API,我得到一个像这样的 json 对象:

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

有人知道我如何通过 http 请求从 GridFS 获取文件吗?

非常感谢!

4

2 回答 2

1

您需要编写自己的视图,但您可以让它看起来像是 API 的一部分。一、观点:

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

然后,您可以将其映射到您的urls.py

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

并确保美味派在输出中显示您想要的内容:

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

只要确保假 API 视图出现在您的实际 API 定义之前,您就应该准备就绪!

于 2013-08-01T02:08:54.633 回答
0

保罗的提示很有用。在这里,我已经完全以美味的方式实现了这一点,用于上传和下载图像。

干得好..

1. 覆盖解串器以支持“多部分”。

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.模型类

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.资源类

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"))

希望这对将来的每个人都非常有用。:)

于 2014-04-20T06:45:35.487 回答