Django 意外的 405 响应

Django Unexpected 405 Response

  1. 问题

    我的 Django 应用程序经常响应 405 Method Now Allowed 即使 它正在 api 开发环境中工作。但是如果我重新启动 开发服务器 (python manage.py runserver) 它有效。

  2. 环境

    • macOS 莫哈韦沙漠 10.14
    • Python 3.6.4(通过 Pipenv 隔离环境)
    • Django 2.1.4
    • djangorestframework 3.8.2
  3. API代码

    settings/urls.py(根 url 文件)

    from django.urls import path, include
    
    import my_account.urls
    
    urlpatterns = [
        path('account/', include(my_account.urls, namespace='account_v1')),
    ]
    

    my_account/urls.py

    from django.urls import path
    
    from .apps import MyAccountConfig
    from .views import TokenView
    
    app_name = MyAccountConfig.name
    
    urlpatterns = [
        path('token/', TokenView.as_view()),
    ]
    

    my_account/views.py

    from rest_framework.views import APIView
    
    class TokenView(APIView):
        def post(self, request):
            # Some Business-Logic Code
            pass
    
  4. 日志

    发生 405 时记录

    System check identified no issues (0 silenced).
    December 07, 2018 - 11:22:54
    Django version 2.1.4, using settings 'my_server.settings.staging'
    Starting development server at http://0.0.0.0:8000/
    Quit the server with CONTROL-C.
    .env Applied
    [07/Dec/2018 11:24:30] "OPTIONS /account/token/ HTTP/1.1" 200 0
    [07/Dec/2018 11:24:30] "{"email":"email@hidden.com","password":"hidden_password"}POST /account/token/ HTTP/1.1" 405 66
    

    工作时登录

    System check identified no issues (0 silenced).
    December 07, 2018 - 11:48:01
    Django version 2.1.4, using settings 'my_server.settings.staging'
    Starting development server at http://0.0.0.0:8000/
    Quit the server with CONTROL-C.
    .env Applied
    [07/Dec/2018 11:48:08] "OPTIONS /account/token/ HTTP/1.1" 200 0
    [07/Dec/2018 11:48:09] "POST /account/token/ HTTP/1.1" 200 517
    

    在 chrome 网络选项卡中,请求 200 和 405 之间没有区别。

HTTP_405_METHOD_NOT_ALLOWED

状态码405表示您正在以不允许的方式请求。 根据您的代码,您将令牌 API 定义为可通过 post 方法访问。

看看这个日志:

[07/Dec/2018 11:48:09] "POST /account/token/ HTTP/1.1" 200 517

在此您发送明确的 POST 请求,这样就可以了。但请查看提供的失败案例日志:

[07/Dec/2018 11:24:30] "{"email":"email@hidden.com","password":"hidden_password"}POST /v1/account/token/ HTTP/1.1" 405 66

1- 由于某些原因,在您的 UI 中,您正在使用方法 {"email":"email@hidden.com","password":"hidden_password"}POST!!!! 发送请求。

2- 并且您正在向 /v1/account/token/ API 端点发送请求,该端点根本没有在您的网址中注册(根据您提供给我们的信息)

我在过去的两个月里遇到了同样的错误,最终我在最后解决了。 错误: 当用户令牌过期时,我们将收到带有未经授权消息的 401 状态代码,当发生这种情况时,下一个 API 也会被中断 returns 405 Method Not Allowed 作为错误。
解决方案 : Django 版本 2.1 中存在错误问题,您必须将 Django 版本升级到 2.2。

之后检查这个错误,它不会出现。