2

Django にプロジェクトがあり、mongoengine を使用して、GridFSStorage を使用して画像を Mongo データベースに保存しています。

これまでのところすべて問題ありませんが、問題は... django-tastypie-mongoengineで作成されたREST APIを使用して、httpリクエストを介して画像を取得しようとすると、次のようなjsonオブジェクトが返されます:

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

httpリクエストを介してGridFSからファイルを取得する方法を知っている人はいますか?

どうもありがとう!

4

2 に答える 2

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 に答える