2013-10-08 2 views
0

Я не могу получить TastyPie, чтобы принять запрос POST, сделанный через Ajax или нет. Я получаю сообщение об ошибке:Django TastyPie 0.10.0 не принимает POST-запрос

The format indicated 'multipart/form-data' had no available deserialization method. Please check your formats and content_types on your Serializer.

Мои модель ресурсов являются:

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 полностью терпит неудачу. Я использую POSTMAN в Chrome для тестирования. Может ли кто-нибудь увидеть, что я делаю неправильно?

EDIT:

Я реализовал cookie based authentication for TastyPie и все работает, как ожидалось.

ответ

0

добавить Следуя MIDDLEWARE_CLASSES в вашем файле settings.py

MIDDLEWARE_CLASSES = ( 'mysite.crossdomainxhr.XsSharing' )

Скопируйте этот файл и поместить его в том же уровне, как settings.py

  • crossdomainxhr.py

от Джанго имп орт HTTP

попробовать: от настроек django.conf импорта 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 кроме 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'

класс XsSharing (объект): "" " Это промежуточное программное обеспечение позволяет использовать междоменный XHR с использованием html5 postMessage API.

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 

это поможет

+0

К сожалению, я получаю ту же ошибку. Вот полная трассировка: https://gist.github.com/btaylordesign/6885415/raw/29f167760a2fc2c3ec119b9ac1c0123e936b4b98/gistfile1.txt – Brandon

+0

@Brandon plz пришлите мне ur json Documnet, что ур, отправляющий на POST ваше сообщение, показывает, что данные не отформатированы должным образом –

+0

Это просто: {'coupon_id': 1, 'user_id': 1} – Brandon

Смежные вопросы