0

TastyPie に、Ajax 経由かどうかに関係なく、POST リクエストを受け入れさせることができないようです。エラーが発生します:

'multipart/form-data' が示す形式には、使用可能な逆シリアル化方法がありませんでした。シリアライザformatsで と を確認してください。content_types

私のモデルリソースは次のとおりです。

class ClippedCouponResource(ModelResource):
    class Meta:
        queryset = ClippedCoupon.objects.all()
        allowed_methods = ['get', 'post']
        serializers = UrlencodeSerializer()
        authentication = DjangoCookieBasicAuthentication()
        authorization = DjangoAuthorization()
        default_format = 'application/json'

私のシリアライザは次のとおりです。

from urlparse import urlparse

from tastypie.serializers import Serializer


class UrlencodeSerializer(Serializer):
    formats = ['json', 'jsonp', 'xml', 'yaml', 'html', 'plist', 'urlencode']
    content_types = {
        'json': 'application/json',
        'jsonp': 'text/javascript',
        'xml': 'application/xml',
        'yaml': 'text/yaml',
        'html': 'text/html',
        'plist': 'application/x-plist',
        'urlencode': 'application/x-www-form-urlencoded',
    }

    def from_urlencode(self, data, options=None):
        """ handles basic formencoded url posts """
        qs = dict((k, v if len(v) > 1 else v[0])
            for k, v in urlparse.parse_qs(data).iteritems())
        return qs

    def to_urlencode(self,content):
        pass

現在、私はローカル開発モードにいるだけなので、すべてのリクエストはlocalhost:8000. エンドポイントへの GET リクエストは問題なく実行できます/v2/api/clippedcoupon/が、POST は完全に失敗します。Chrome で POSTMAN を使用してテストしています。誰かが私が間違っていることを見ることができますか?

編集:

TastyPie に Cookie ベースの認証を実装しましたが、すべてが期待どおりに機能しています。

4

1 に答える 1

0

settings.py ファイルの MIDDLEWARE_CLASSES に以下を追加します

MIDDLEWARE_CLASSES = (「mysite.crossdomainxhr.XsSharing」)

このファイルをコピーして、settings.py と同じレベルに配置します。

  • クロスドメインxhr.py

ジャンゴインポートhttpから

try: from django.conf import settings XS_SHARING_ALLOWED_ORIGINS = settings.XS_SHARING_ALLOWED_ORIGINS XS_SHARING_ALLOWED_METHODS = settings.XS_SHARING_ALLOWED_METHODS XS_SHARING_ALLOWED_HEADERS = settings.XS_SHARING_ALLOWED_HEADERS XS_SHARING_ALLOWED_CREDENTIALS = settings.XS_SHARING_ALLOWED_CREDENTIALS except AttributeError: XS_SHARING_ALLOWED_ORIGINS = '*' XS_SHARING_ALLOWED_METHODS = ['POST', 'GET', 'OPTIONS' , 'PUT', 'DELETE', 'PATCH'] XS_SHARING_ALLOWED_HEADERS = ['Content-Type', '*'] XS_SHARING_ALLOWED_CREDENTIALS = 'true'

class XsSharing(object): """ このミドルウェアは、html5 postMessage API を使用してクロスドメイン XHR を許可します。

Access-Control-Allow-Origin: http://foo.example
Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, DELETE

Based off https://gist.github.com/426829
"""
def process_request(self, request):
    if 'HTTP_ACCESS_CONTROL_REQUEST_METHOD' in request.META:
        response = http.HttpResponse()
        response['Access-Control-Allow-Origin']  = XS_SHARING_ALLOWED_ORIGINS
        response['Access-Control-Allow-Methods'] = ",".join( XS_SHARING_ALLOWED_METHODS )
        response['Access-Control-Allow-Headers'] = ",".join( XS_SHARING_ALLOWED_HEADERS )
        response['Access-Control-Allow-Credentials'] = XS_SHARING_ALLOWED_CREDENTIALS
        return response

    return None

def process_response(self, request, response):
    response['Access-Control-Allow-Origin']  = XS_SHARING_ALLOWED_ORIGINS
    response['Access-Control-Allow-Methods'] = ",".join( XS_SHARING_ALLOWED_METHODS )
    response['Access-Control-Allow-Headers'] = ",".join( XS_SHARING_ALLOWED_HEADERS )
    response['Access-Control-Allow-Credentials'] = XS_SHARING_ALLOWED_CREDENTIALS

    return response

これは役に立ちます

于 2013-10-08T14:10:34.737 に答える