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

  • Environment

  • macOS Mojave 10.14
  • Python 3.6.4 (Isolated environment via Pipenv)
  • Django 2.1.4
  • djangorestframework 3.8.2
  • API代码

    settings/urls.py (root url file)

    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
    

    Log when 405 occured

    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
    

    Log when working

    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之间没有区别。

  • python
    django
    django-rest-framework
    http-status-code-405
    Dongeon Kim
    Dongeon Kim
    发布于 2018-12-07
    2 个回答
    Sundar-maX
    Sundar-maX
    发布于 2018-12-07
    已采纳
    0 人赞同

    在过去的两个月里,我也面临着同样的错误,最终我解决了这个问题。 当用户令牌过期时,我们会收到401状态代码和未授权信息,当这种情况发生时,下一个API也会被打断,它返回405方法不允许的错误。
    解决方案。 Django 2.1版本有一个错误问题,你必须将你的Django版本升级到2.2。

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

    Reza Torkaman Ahmadi
    Reza Torkaman Ahmadi
    发布于 2018-12-07
    0 人赞同

    http_405_method_not_allowed

    The 状态代码405 代表你在一个不允许的方法中请求。 根据你的代码,你定义的Token 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