2

Multipart/Form-Data フォームと Tastypie API を介してファイルをアップロードしようとしていますが、いくつかの問題が発生しています。

私のモデル:

class Client(models.Model):
    account = models.ForeignKey(Account)
    client_image = models.FileField(upload_to=client_image_path, default="/assets/img/default-user-image.png", blank=True, null=True)
    client_image_thumb = models.FileField(upload_to=client_image_thumb_path, default="/assets/img/default-user-image.png", blank=True, null=True)

Tastypie Issue#42 で説明されているように、カスタムのデシリアライズ メソッドを使用しています。

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)

    def put_detail(self, request, **kwargs):
        if request.META.get('CONTENT_TYPE').startswith('multipart') and \
                not hasattr(request, '_body'):
            request._body = ''

        return super(MultipartResource, self).put_detail(request, **kwargs)

そして、これが私の対応するModelResourceです:

class ClientResource(MultipartResource, ModelResource):
    account = fields.ForeignKey(AccountResource, 'account')

    class Meta():
        queryset = Client.objects.all()
        always_return_data = True
        resource_name = 'account/clients/client-info'
        authorization = AccountLevelAuthorization()
        list_allowed_methods = ['get','post','put','delete','patch']
        detail_allowed_methods = ['get', 'post', 'put', 'delete','patch']
        authentication = ApiKeyAuthentication()
        filtering = {
            'username': ALL,
        }

content-type application/JSON で POST を実行し、client_image フィールドを含めない場合、新しいクライアント オブジェクトが正常に作成されます。これは、モデル/リソースが正常に機能していることを示しています。

ただし、Multipart/Form-Data コンテンツ タイプを使用しようとすると、次のペイロードで適切にデシリアライザーを通過することがわかります。

------WebKitFormBoundaryp0Q7Q9djlsvVGwbb
Content-Disposition: form-data; name="{%0D%0A%22account%22"

"/api/v1/account/account-info/21/",

------WebKitFormBoundaryp0Q7Q9djlsvVGwbb
Content-Disposition: form-data; name="client_image"; filename="donavan.jpg"
Content-Type: image/jpeg

------WebKitFormBoundaryp0Q7Q9djlsvVGwbb--

デバッグ中にこの QueryDict も表示され、InMemoryUploadedFile が正しく表示されます。

<QueryDict: {u'client_image': [<InMemoryUploadedFile: donavan.jpg (image/jpeg)>], u'{%0D%0A%22account%22': [u'"/api/v1/account/account-info/21/"']}>

しかし、私はこのエラーを受け取り続けます:

{ error_message: "" traceback: "Traceback (最新の呼び出しが最後): ファイル "/Users/stevewirig/Documents/www/vu/venv/lib/python2.7/site-packages/tastypie/resources.py"、202 行目、ラッパー応答 = callback(request, *args, **kwargs) ファイル "/Users/stevewirig/Documents/www/vu/venv/lib/python2.7/site-packages/tastypie/resources.py"、440 行目、dispatch_list return self.dispatch('list', request, **kwargs) ファイル "/Users/stevewirig/Documents/www/vu/venv/lib/python2.7/site-packages/tastypie/resources.py", 472 行目、dispatch response = method(request, **kwargs) File "/Users/stevewirig/Documents/www/vu/venv/lib/python2.7/site-packages/tastypie/resources.py"、1328 行目、 post_list で updated_bundle = self.obj_create(bundle, **self.remove_api_resource_names(kwargs)) ファイル "/Users/stevewirig/Documents/www/vu/venv/lib/python2.7/site-packages/tastypie/resources.py"、2104 行目、obj_create bundle = self.full_hydrate(bundle) 内ファイル "/Users/stevewirig/Documents/www/vu/venv/lib/python2.7/site-packages/tastypie/resources.py"、890 行目、full_hydrate 値 = field_object.hydrate(bundle) ファイル "/Users/ stevewirig/Documents/www/vu/venv/lib/python2.7/site-packages/tastypie/fields.py"、732 行目、ハイドレート値 = super(ToOneField, self).hydrate(bundle) ファイル"/Users/ stevewirig/Documents/www/vu/venv/lib/python2.7/site-packages/tastypie/fields.py"、165 行目、ハイドレート elif self.attribute および getattr(bundle.obj, self.attribute, None):ファイル "/Users/stevewirig/Documents/www/vu/venv/lib/python2.7/site-packages/django/db/models/fields/related.py"、343 行目get raise self.field.rel.to.DoesNotExist DoesNotExist " }

これが壊れる可能性のあるアイデアはありますか?前もって感謝します!

4

2 に答える 2