web-dev-qa-db-ja.com

405 POSTメソッドは許可されていません

OAuthでRESTプロバイダーを開発しようとしています。Django RESTFrameworkとDjangoOAuthToolkitを使用しています。 m POSTを使用しようとすると、サーバーは{"detail": "Method 'POST' not allowed。"}で応答します}これは私のコードです:

# views.py
@api_view(['POST'])
def pruebapost(request):
    usuario = User()
    access_token = Token.objects.get(
        key=request.POST['oauth_token']
    )
    usuario = access_token.user
    content = {'saludo': usuario.username}
    return Response(content)

# settings.py
OAUTH_AUTHORIZE_VIEW = 'principal.views.oauth_authorize'
SESSION_SERIALIZER = 'Django.contrib.sessions.serializers.JSONSerializer'
REST_FRAMEWORK = {
   'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
    ),
   'DEFAULT_PARSER_CLASSES': (
        'rest_framework.parsers.JSONParser',
    ),
   'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.OAuthAuthentication',
    ),
}

そして、私はこれを「テスト」クライアントとして使用しています。

import urlparse
import oauth2 as oauth
import requests

consumer_key = "clave"
consumer_secret = "secreto"
consumer = oauth.Consumer(consumer_key, consumer_secret)
client = oauth.Client(consumer)
resource_url = 'http://blablabla.pythonanywhere.com/prueba'
consumer = oauth.Consumer(key='clave', secret='secreto')
token = oauth.Token(key='e7456187a43141af8d2e0d8fa99b95b9',
                    secret='3wRIKoacff16tcew')

oauth_request = oauth.Request.from_consumer_and_token(
    consumer,
    token,
    http_method='POST',
    http_url=resource_url,
    parameters={'hola':'pepe'}
)
oauth_request.sign_request(
    oauth.SignatureMethod_HMAC_SHA1(),
    consumer,
    token
)
url = oauth_request.to_url()
response = requests.post(url, oauth_request.to_postdata())
print response.content

RESTフレームワークのドキュメントでは、405メソッドは許可されていません

「ビューのハンドラーメソッドにマップされない着信要求が発生したときに発生します。」

ありがとう

36
user2663554

これは ser2663554 によってコメントで解決されました

問題が解決しました。URLのスラッシュが1つありません。

この応答コード(405)は、さまざまな問題から発生する可能性がありますが、通常、間違ったURLを使用している(この場合のように)か、間違った要求メソッドを使用していることになります。時々それは両方です!

個々のリソースを更新しようとすると、この問題が発生することがよくあります(/api/res/1)、ただしリストURL(/api/res)リクエストを許可しません。これは、誰かが新しいインスタンスを作成しようとしているが、個々のオブジェクトにPOSTリクエストを送信している逆の場合にも発生する可能性があります。

場合によっては、間違ったURLが使用されているため、ユーザーは標準の非APIビューを要求し、それがAPIビューであると考えています(/res の代わりに /api/res)。そのため、必ずURLを確認してください!

42
Kevin Brown

私の場合、同じベースURLを持つルーターがありました

router.register('sales', SalesViewSet, basename='sales')

私のURLパターンは

urlpatterns = [
    path('', include((router.urls, app_name))),
    path('sales/analytics/', Analytics.as_view(), name='create'),
]

sales/analytics/で405エラーが発生していました。解決策は、urlpatternsの順序を変更することでした。

urlpatterns = [
    path('sales/analytics/', Analytics.as_view(), name='create'),
    path('', include((router.urls, app_name))),
]
3
nithin
class ApiIndexView(APIView)

これの代わりに、「rest_framework import genericsからインポート」して、それを

class ApiIndexView(generics.ListCreateAPIView) 

汎用リストには多くのビューがありますcreateAPIviewはgetおよびpostに使用され、createapiviewはpostメソッドにのみ使用されます

2
Prasad Giri