Django - отправка запроса OPTIONS во второй раз добавит данные тела в метод запроса - PullRequest
0 голосов
/ 24 декабря 2018

Проблема заключается в том, что при наличии содержимого внутри тела с методом OPTIONS второй запрос всегда будет завершаться с сообщением Метод не разрешен .Распечатал журнал и показал, что метод стал "{"username":"test","password":"test"}POST /member/login/ HTTP/1.1" 405 111.Проблема в том, что после перезапуска сервера первый запрос OPTIONS пройдет нормально.Попробовал только с POST, и он отлично работает.Эта проблема есть только у OPTIONS.

ENV: python: 3.6.5, django: 2.1.3, drf: 3.9.0, django-cors-headers: 2.4.0

views.py (Показывать только украшения, потому что оно не вошло в блок):

@csrf_exempt
@api_view(['POST'])
@authentication_classes([])
@permission_classes([AllowAny])
def member_login(request):
    pass

middlewares:

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

Метод запроса: ОПЦИИ и POST

Заголовок запроса:

Content-Type: application/json
Origin: http://google.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-PINGOTHER,Content-Type

Тело запроса:

{"username":"superuser","password":"pass1234"}

После отправки запроса OPTIONS 2 раза:

INFO 2018-12-25 02:26:03,585 "OPTIONS /member/login/ HTTP/1.1" 200 0
WARNING 2018-12-25 02:26:10,180 Method Not Allowed: /member/login/
WARNING 2018-12-25 02:26:10,182 "{"username":"superuser","password":"pass1234"}OPTIONS /member/login/ HTTP/1.1" 405 98

После получения ошибки, когда метод не разрешен, невозможно отправить любой другой запрос в API.Он всегда будет возвращать Метод не разрешен , даже если я использую другой метод.

WARNING 2018-12-25 02:30:57,939 Method Not Allowed: /member/login/
WARNING 2018-12-25 02:30:57,940 "{"username":"superuser","password":"pass1234"}POST /member/login/ HTTP/1.1" 405 95
WARNING 2018-12-25 02:30:58,603 Method Not Allowed: /member/login/
WARNING 2018-12-25 02:30:58,603 "{"username":"superuser","password":"pass1234"}POST /member/login/ HTTP/1.1" 405 95
WARNING 2018-12-25 02:30:59,684 Method Not Allowed: /member/login/
WARNING 2018-12-25 02:30:59,685 "{"username":"superuser","password":"pass1234"}POST /member/login/ HTTP/1.1" 405 95

Пробовал с более старой версией Django.Эта проблема не произошла.

1 Ответ

0 голосов
/ 16 января 2019

Обновление до Django>=2.1.5 исправит это.Это связано с этой проблемой: HTTP-сервер не очищает данные предыдущего запроса в соединении keep-alive

Проблема заключалась в том, что реализация сервера WSGI для runserver не потребляла запроссодержание, когда был OPTIONS запрос.А с помощью соединения keep-alive остальные данные считываются содержимым для последующего запроса.

...