405 POST方法不允许

use*_*554 38 django post oauth http-status-code-405 django-rest-framework

我正在尝试使用OAuth开发REST提供程序.我正在使用Django RESTFramework和DjangoOAuthToolkit.我做了一个GET并且它工作得很好但是我正在尝试使用POST而服务器响应{"detail":"方法'POST'不允许."}这是我的代码:

# 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',
    ),
}
Run Code Online (Sandbox Code Playgroud)

我正在使用它作为"测试"客户端:

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
Run Code Online (Sandbox Code Playgroud)

我不明白REST Framework文档中有关405方法不允许的内容

"当发生的传入请求未映射到视图上的处理程序方法时引发."

谢谢

Kev*_*own 44

这在user2663554的评论中得到了解决

问题解决了,我错过了网址上的一个斜线.

此响应代码(405)可以来自任何数量的问题,但通常最终会导致您使用错误的URL(如本例中所示),或者您使用了错误的请求方法.有时它们都是!

我经常看到人们在尝试更新单个资源时遇到此问题(/api/res/1),但他们使用的列表url(/api/res)不允许发出请求.这也可以反过来发生,有人试图创建一个新实例,但他们正在向POST单个对象发送请求.

在某些情况下,正在使用错误的URL,因此用户正在请求标准的非API视图,并认为它是API视图(/res而不是/api/res).所以一定要经常检查你的网址!

  • 在我的情况下,我使用的是http而不是https,但你的回答帮助我解决了问题. (4认同)

Nit*_*hin 6

就我而言,我的路由器具有相同的基本网址

router.register('sales', SalesViewSet, basename='sales')
Run Code Online (Sandbox Code Playgroud)

我的网址格式是

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

我收到405错误的提示 sales/analytics/。解决的办法是更改urlpatterns的顺序。

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