2012-08-08 2 views
3

나는 정적 인 미디어를 제공하기 위해 Nginx 인스턴스에 의해 front'ed 인 Apache에서 Django 사이트를 실행하고 있습니다.django-tastypie PATCH는 "400 (Bad Request)"을 제공합니다

필드를 패치해야하는 모델에 django-tastypie를 통해 API를 노출합니다. 장고 runserver를 통해 로컬 테스트를 수행하면 모든 것이 예상대로 작동합니다. 그러나 라이브 서버에서는 "400 (Bad Request)"이 반환됩니다.

Nginx가 Patch를 지원하지 않는다고 말하는 곳을 몇 군데 읽었습니까? 그게 맞습니까? 이것에 대한 좋은 해결 방법이 있습니까? 내가 뭔가 잘못하고 있는거야?

postData을 통해 업데이트하려는 필드를 통해서만 전송합니다.

JQuery와 코드 :

$.ajax({url: '...', 
    type: 'PATCH', 
    accepts: 'application/json', 
    contentType: 'application/json', 
    dataType: 'json', 
    data: postData, 
    processData: false, 
    success: function() { 
     // Success Code! 
    }, 
    error: function() { 
     // Error Code! 
    } 
}); 

Tastypie 리소스 :

class ReceivedMessageResource(ModelResource): 
    """ 
    """ 
    campaign = fields.ForeignKey(CampaignResource, 'campaign') 
    campaign_name = fields.CharField(readonly=True) 
    campaign_id = fields.IntegerField(readonly=True) 
    message_type = fields.CharField(readonly=True) 
    display_date = fields.CharField(readonly=True) 
    attachments = fields.ToManyField('apps.campaign.api.AttachmentResource', 
            'attachment_set', 
            related_name='message', 
            full=True) 

    class Meta: 
     queryset = ReceivedMessage.objects.all() 
     resource_name = 'message' 
     filtering = {'id': ALL, 
        'campaign': ALL_WITH_RELATIONS} 
     excludes = ['reason', 'provider', 'loyalty_profile', 'original_message', 'date_received'] 
     allowed_methods = ['get', 'post', 'put', 'delete', 'patch'] 
     paginator_class = ReceivedMessagesPaginator 
     authentication = ApiKeyAuthentication() 
     authorization = DjangoAuthorization() 
이를 정렬하는 방법에 대한 방향을 이해할 수있을 것이다

: PATCH가

+0

패치 할 URL은 무엇입니까? api/v1/message/또는 api/v1/message/1 /? – santiagobasulto

+0

패치/api/v1/message/1/아직 기쁨이 없습니다. 나는이 Nginx에 뭔가를 할 필요가 있다고 생각하는 것처럼 보이는이 post (http://stackoverflow.com/questions/10069871/heroku-and-django-with-405-error)를 보았습니다. 그러나 저의 삶을 위해서 나는 할 수 없습니다. -/ –

+0

문제가 "계층"인지 파악하기 시작해야합니다. HTTP 서버 또는 응용 프로그램 (Tastypie)에있는 경우인증 및 허가를 제거하고 몇 가지 테스트를 해보십시오. 또한, 이것을 Meta 클래스에 추가하십시오 : detail_allowed_methods = [ 'patch'] – santiagobasulto

답변

4

, 당신이 지시를 from the documentation를 따를 수 :

지원되지 않는 장소에서 특정 브라우저 나 호스트처럼

일부 장소를 PUT/DELETE/PATCH를 사용

, 모든 안 (PUT/DELETE/PATCH 방법). 이러한 환경에서는 X-HTTP-Method-Override 헤더를 제공하여 이러한 종류의 요청을 시뮬레이션 할 수 있습니다. 호스트가이 메소드를 지원하지 않는 경우

curl --dump-header - -H "Content-Type: application/json" -H "X-HTTP-Method-Override: PATCH" -X POST --data '{"title": "I Visited Grandma Today"}' http://localhost:8000/api/v1/entry/1/ 

그래서, 당신이하려고하는 메소드의 이름과 X-HTTP-Method-Override 헤더를 추가 : 예를 들어, POST를 통해 PATCH 요청을 보내, 당신은 같은 요청을 보낼 것 수행 할.

+0

이것을 시도하고 로그를 살펴보고 X-HTTP-Method-Override 헤더가 내 Nginx에서 Apache 서버로 전달되지 않는 것으로 보입니다. 내 Nginx conf에 추가해야 할 proxy_pass 설정을 아십니까? –

+0

아파치 인스턴스 (Nginx 뒤에 있음)가 X-HTTP-Method-Override 헤더를 얻지 못한다는 것을 확인했습니다. 어떻게 든 내 Nginx가이 헤더를 Apache로 전달할 수 있어야한다고 가정합니다. –

+0

내 문제를 발견했습니다. JQuery에서 headers : { 'X_HTTP_METHOD_OVERRIDE': 'PATCH'}와 같은 헤더를 전달하고 있었고 'headers : {'X-HTTP-Method-Override ':'PATCH '}, –

0

을받지 않은 경우 HTTP 서버를 지나쳐 가짜로 만들 수 있습니다. POST 요청을 사용하고 'X-HTTP-Method-Override'헤더를 추가하십시오 : 'PATCH'. 이것은이 게시 시점에 Tastypie의 마스터 지점에서 지원됩니다.

현재 stable 릴리스 0.9.11과 같은 이전 버전을 사용하는 경우 작은 패치가 필요할 수 있습니다. this gist과 같은 것은 Tastypie에게 그 헤더를 사용하도록 가르쳐 줄 것입니다.

관련 작품은 여기에 있습니다 :

당신이 (8 월 5 일 이후 GitHub의 저장소에서 하나) TastyPie의 최신 버전을 사용하는 경우
if request_method == 'post' and 'HTTP_X_HTTP_METHOD_OVERRIDE' in request.META: 
     request_method = request.META['HTTP_X_HTTP_METHOD_OVERRIDE'].lower() 
+1

아이디어는 흥미롭지 만 필요하지는 않습니다 : TastyPie는 이미 더 유연한 방식으로'X-HTTP-Method-Override' 헤더를 지원합니다. 나는 관련 정보를 가지고 나의 대답을 게시했다. – Tadeck

+0

실제로 최신 버전에서는이 기능에 대한 지원이 추가 된 것처럼 보입니다. 내 대답 업데이트 중. – dokkaebi

관련 문제