2016-03-21 10 views
2

私が働いている会社は、3django-rest-frameworkは、 `ModelViewSet`に対してデフォルトの` allowed_methods`がどうあるべきかを決めるのですか?

  • 両方のプロジェクトは、両方のビューセットが明示的にallowed_methodsプロパティを定義しないと、単に何でもDRFの数字を使用しているModelViewSet
  • を拡張ビューセット持っジャンゴとDRFを使用する2つのプロジェクトを持っていますデフォルトにする必要があります
  • 両方上書きまたは任意のハンドラメソッド(create()update()partial_update()patch()など)
を定義していないビューセット0

ただし、1つのプロジェクトでは、allowed_methodsプロパティの既定値は[u'GET', u'PUT', u'PATCH', u'DELETE', u'HEAD', u'OPTIONS']です。その他の場合はallowed_methodsはデフォルトで[u'GET', u'POST', u'HEAD', u'OPTIONS']になります。したがって、私は

の方法で "405"を返します。

私はPATCH要求を送信しようとしました。

なぜプロジェクト2はより制限されますか?

答えて

2

DRF only exposes Djangoの内部_allowed_methods()ので、私たちはthat methodの実施を検討する必要があります

def _allowed_methods(self): 
    return [m.upper() for m in self.http_method_names if hasattr(self, m)] 
として self.http_method_namesが定義されている

http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'] 

はこれらclasesはそれができた定義どの方法に違いがありますあなたが見ていることを説明してください。

+0

お返事ありがとうございます。2つのビューセットで定義されている唯一のメソッドは 'get_queryset()'と 'get_serializer_class()'なので、その違いを説明することはできません...プロジェクト1では 'patch()'メソッド( 'ModelViewSet'で定義されている)' partial_update() 'に直接マップされるので、' hasattr(self、 'patch') 'はtrueを返しますが、プロジェクト2ではそこには接続がありません。どのようなアイデアは、プロジェクト1のそれを引き起こすだろうか?ビューセット自体は、その接続を作成/定義していません... – Troy

1

短い答え:私の場合は

が、私は偶然ではなくput/patch URLよりも、私のPATCHlist URLに送信していました。


長い答え:

を私はこの問題は、一つのプロジェクトがallowed_methodsごとに異なるデフォルト値を持っているということではありません、それはビューセットの変更のaction_mapallowed_methods性質がビューセットのそれに基づいていることだことがわかりましたaction_mapはルータの影響を受けます(SimpleRouter.routesを参照)。

私がやっていたとしてあなたは、PATCHまたはPUTで「/ // [BASE_URL] /あなたのモデルを」ヒットしようとするのであれば、それだけで['GET', 'POST', 'HEAD', 'OPTIONS']が許可されている、とpatch()partial_update()にリンクされないことを言うだろう、同じViewSetクラスを使用していても、そのクラスにはpartial_update()が存在します。

PATCHを送信する場合は、// [base_url]/your-model/[some_id] /に送信する必要があります。

関連する問題