Джанго Неожиданный Ответ 405 - PullRequest
0 голосов
/ 07 декабря 2018
  1. Проблема

    Мое приложение django часто отвечает 405 Method Now Allowed, даже если оно работает API в среде разработки.Но если я перезапущу сервер разработки (python manage.py runserver), он работает.

  2. Среда

    • macOS Mojave 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 Network нет разницы между запросом на 200 и 405.

1 Ответ

0 голосов
/ 07 декабря 2018

HTTP_405_METHOD_NOT_ALLOWED

Код состояния 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

1- По какой-то причине в вашем пользовательском интерфейсе вы отправляете запрос методом {"email":"email@hidden.com","password":"hidden_password"}POST !!!!.

2- и вы отправляете запрос на /v1/account/token/ конечную точку API, которая вообще не зарегистрирована в ваших URL (в зависимости от того, какую информацию вы нам предоставили)

...