Django rest framework + axios: неверный http-метод перед полетом при первом запросе - PullRequest
0 голосов
/ 23 января 2019

У нас довольно странная ситуация с внешним интерфейсом, основанным на реакции, использующим axios для общения с нашим внутренним интерфейсом, основанным на Django.

Когда вход в систему перед запросом OPTIONS отправляется axios (как и ожидалось), но в первый раз, когда сервер получает его, он выглядит некорректно и, следовательно, приводит к 401. Однако, если я повторяю или даже повторяю тот же самый запрос, используя инструмент разработки для браузера, серверная часть принимает запрос OPTIONS, и все работает как положено. Мы можем последовательно воспроизвести это.

Журнал сервера разработки Django выглядит следующим образом:

Первый запрос

[23/Jan/2019 15:43:42] "{}OPTIONS /backend/api/auth/login/ HTTP/1.1" 401 

Последующая попытка

[23/Jan/2019 15:43:52] "OPTIONS /backend/api/auth/login/ HTTP/1.1" 200 0
[23/Jan/2019 15:43:52] "POST /backend/api/auth/login/ HTTP/1.1" 200 76

Итак, как вы можете видеть, фигурные скобки добавляются в метод запроса, что означает, что запрос не считается запросом OPTIONS, и поэтому возвращается 401.

Вид Джанго

class LoginView(KnoxLoginView):
    authentication_classes = [BasicAuthentication]

# urls.py (extract)
path('auth/login/', LoginView.as_view(), name='knox_login'),

Запрос Axios

axios.post('/backend/api/auth/login/', {}, {
            headers: {
                'Authorization': 'Basic ' + window.btoa(creds.username + ":" + creds.password)
            }
        }).then((response) => {
            dispatch({type: 'SIGNIN_SUCCESS', response})
        }).catch((err) => {
            dispatch({type: 'SIGNIN_ERROR', err})
        })

Некоторая информация о версии пакета

Django==2.1.4
django-cors-headers==2.4.0
django-debug-toolbar==1.11
django-extensions==2.1.4
django-rest-knox==3.6.0
django-rest-passwordreset==0.9.7
djangorestframework==3.9.0


axios@0.18.0
...