20

ドキュメント内で SimpleRouter チュートリアルを使用しています。

テストするために、一時的な認証クラスを作成しました。

class BackboneBasicAuthentication(authentication.BaseAuthentication):
    def authenticate(self, request):
        user = User.objects.filter(username="james")
        return (user, None)

設定はこんな感じ

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'core.rest_authentication.BackboneBasicAuthentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
       'rest_framework.permissions.AllowAny',
    ),
}

PUT リクエストを送信すると、405 METHOD NOT ALLOWED が返される

{"detail": "Method 'PUT' not allowed."}

X-HTTP-Method-Override も試しました。立ち入り禁止。

私が間違っていることはありますか?

私はこれを理解しようと丸一日を費やしました。誰かが助けてくれることを願っています! :)

4

2 に答える 2

20

単純なルーターは、追加のパターン要素として追加された pk を使用して、指定したパターンに一致する URL のビューに put 属性を追加します。

たとえば、次を使用した場合:

simple_router.register('widgets/', WidgetViewSet)

フレームワークは 2 つの URL パターンを作成します。

'^widgets/$'
'^widgets/<?P<pk>[^/]+/$'

フレームワークによってビューセット インスタンスに「get」(「list」) および「post」(「create」) のサポートのみが追加される最初の一致を満たす URL のみを試しているので、エラーが発生すると推測しています。配置/パッチまたは削除しようとすると表示されます。これらのメソッドを機能させるには、変更または削除するウィジェットをフレームワークが認識し、URL がそれらのメソッドをサポートするビューと一致するように、pk を指定する必要があります。

これは紛らわしいので、あまりにも紛らわしいと思う場合は、simple_router をまったく使用しないことを選択できます。次に、独自のメソッド マッピングを指定して、rest_framework が put メソッドにディスパッチされるようにすることができます。

url('^widgets/<?P<pk>[^/]+/$', WidgetViewSet.as_view({'put': 'update', 
                                                      'get': 'retrieve', 
                                                      'patch': 'partial_update', 
                                                      'delete': 'destroy'}...)
于 2013-11-20T23:21:50.780 に答える