【问题标题】:405 POST method not allowed405 POST 方法不允许
【发布时间】:2014-05-23 21:00:40
【问题描述】:

我正在尝试使用 OAuth 开发 REST 提供程序。我正在使用 Django RESTFramework 和 DjangoOAuthToolkit。我做了一个 GET 并且它工作得很好但是我正在尝试使用一个 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 Framework 文档中关于 405 Method not allowed 的说法

“当出现未映射到视图上的处理程序方法的传入请求时引发。”

谢谢

【问题讨论】:

  • 基本上,该错误意味着您不允许在特定视图上调用特定的 HTTP 方法,或者更常见的是您调用了错误的 url。检查你是否打电话给正确的人。你也可以在这里提供你的 urls 配置。
  • 问题解决了,我错过了网址上的一个斜线。非常nooby的问题。谢谢!
  • 在我的情况下,端点甚至不可用。我忘了把它添加到 urls.py 中。非常混乱。

标签: django post oauth django-rest-framework http-status-code-405


【解决方案1】:

user2663554 在 cmets 中解决了这个问题

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

此响应代码 (405) 可能来自任意数量的问题,但通常会导致您使用了错误的 URL(如本例所示),或者您使用了错误的请求方法。有时两者兼而有之!

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

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

【讨论】:

  • 就我而言,我使用的是 http 而不是 https,但您的回答帮助我弄清楚了。
【解决方案2】:

在我的情况下,我有一个具有相同基本 url 的路由器

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

我的网址格式是

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】:
    class ApiIndexView(APIView)
    

    请改为“从 rest_framework 导入泛型”并将其更改为

    class ApiIndexView(generics.ListCreateAPIView) 
    

    通用列表中有很多视图createAPIview用于get和post,createapiview仅用于post方法

    【讨论】:

      【解决方案4】:

      我对 SO 的第一个回答。在尝试了这里的一切并在过去 6 小时内感到沮丧之后,它终于击中了我,我找到了可能发生这种情况的另一个原因; 很简单,我没有登录到 /admin。 我登录到 /admin 并修复了“不允许使用 HTTP 405 方法”的问题,即帖子视图没有出现。我希望这可以帮助任何遇到此类问题的人。

      【讨论】:

        猜你喜欢
        • 2018-12-20
        • 2015-11-16
        • 2016-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-07
        • 2016-12-04
        • 2013-10-01
        相关资源
        最近更新 更多