3

静的メディアを提供するためにNginxインスタンスが前面にあるApacheでDjangoサイトを実行しています。

django-tastypieを介してAPIを、フィールドをパッチする必要のあるモデルに公開します。(django runserverを介して)ローカルテストを行うと、すべてが期待どおりに機能します。ただし、ライブサーバーでは、「400(BadRequest)」が返されます。

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()

これをソートする方法についての任意の方向が高く評価されます:)

4

2 に答える 2

4

TastyPieの最新バージョン(8月5日以降のGitHubリポジトリからのもの)を使用している場合は、ドキュメントの指示に従うことができます。

PUT/DELETE/PATCHサポートされていない場所での使用

特定のブラウザやホストなど、一部の場所ではPUT//メソッドが許可されていません。これらの環境では、ヘッダーを提供することで、これらの種類のリクエストをシミュレートできます。たとえば、を介してリクエストを送信するには、次のようなリクエストを送信します。DELETEPATCHX-HTTP-Method-OverridePATCHPOST

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は、実行しようとしているメソッドの名前を含むヘッダーを追加してください。

于 2012-08-16T10:45:49.250 に答える
0

PATCHがHTTPサーバーを通過していない場合は、偽造することができます。POSTリクエストを使用し、ヘッダー'X-HTTP-Method-Override':'PATCH'を追加します。これは、この投稿の時点でTastypieのマスターブランチでサポートされています。

現在の安定版リリース0.9.11などの古いバージョンを使用している場合は、小さなパッチが必要になる場合があります。この要点のようなものは、Tastypieにそのヘッダーを使用するように教えます。

関連する部分はここにあります:

    if request_method == 'post' and 'HTTP_X_HTTP_METHOD_OVERRIDE' in request.META:
        request_method = request.META['HTTP_X_HTTP_METHOD_OVERRIDE'].lower()
于 2012-08-15T16:14:33.453 に答える