Тестовый клиент Django не предоставляет правильные заголовки аутентификации - PullRequest
0 голосов
/ 13 февраля 2019

При отправке запроса на сервер разработки я могу включить заголовок следующим образом:

Authorization: Token efc7fa291f4e320ff4a31cf9a11d6de3a366937cd1ec24e0a7ab68dafa38430f\r\n

Внутри Django видит заголовок HTTP_AUTHORIZATION, который, я не уверен, где генерируется.

Но при использовании тестового клиента Django для модульного тестирования:

from django.test import Client

c = Client()
response = c.get('/api/auth/user/', **{'Authorization': 'Token ' + token})

Django не может авторизовать запрос.

Если вместо этого я сделаю следующее:

response = c.get('/api/auth/user/', **{'HTTP_AUTHORIZATION': 'Token ' + token})

Это работает.

Я хотел бы понять, что происходит.

Кто отвечает за выполнение картирования Authorization -> HTTP_AUTHORIZATION?

Соответствуетна этот вопрос: я использую Django 2.1.5, djangorestframework = "==3.9.0" и djangorestframework = "==3.9.0"

1 Ответ

0 голосов
/ 13 февраля 2019

Это то, что в документации Django говорится:

Заголовки, отправляемые через **extra, должны соответствовать спецификации CGI.Например, эмуляция другого заголовка «Host», отправляемого в HTTP-запросе из браузера на сервер, должна передаваться как HTTP_HOST.

А вот соответствующая цитата CGI:

HTTP_ *:

Эти переменные относятся к запросам, сделанным с HTTP.Интерпретация этих переменных может зависеть от значения SERVER_PROTOCOL.

Переменные среды с именами, начинающимися с «HTTP_», содержат данные заголовка, считанные с клиента, если использовался протокол HTTP.Имя заголовка HTTP преобразуется в верхний регистр, все вхождения «-» заменяются на «», и перед ним добавляется «HTTP », чтобы дать имя переменной среды.Данные заголовка могут быть представлены как отправленные клиентом, или могут быть переписаны способами, которые не изменяют его семантику.Если получено несколько заголовков с одинаковым именем поля, они должны быть переписаны как один заголовок с одинаковой семантикой.Аналогично, заголовок, полученный более чем в одной строке, должен быть объединен в одну строку.При необходимости сервер должен изменить представление данных (например, набор символов), чтобы оно соответствовало переменной среды CGI.

Это то, что видит Django, поскольку все ваши запросыобрабатывается CGI-совместимым сервером приложений (на самом деле WSGI, например gunicorn и uwsgi).Таким образом, тестовый клиент в основном хочет запрос CGI, а это означает, что вам необходимо преобразовать заголовки HTTP в соответствии с приведенными выше правилами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...