Пользовательский заголовок не добавляется в request.META в Django Rest Framework

Я реализовал пользовательскую аутентификацию, как описано в документации

# custom_permissions.py

from rest_framework import authentication
from rest_framework import exceptions

class KeyAuthentication(authentication.BaseAuthentication):
    def authenticate(self, request):
        key = request.META.get('Authorization')
        print(key)
        if not key:
            raise exceptions.AuthenticationFailed('Authentication failed.')

        try:
            key = ApiKey.objects.get(key=key)
        except ApiKey.DoesNotExist:
            raise exceptions.AuthenticationFailed('Authentication failed.')

    return (key, None)

В моих настройках:

# settings.py

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'api_server.apps.api_v1.custom_permissions.KeyAuthentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.AllowAny',
    ),
}

Работает как положено во время тестов:

def test_1(self):
    client = APIClient()
    client.credentials(X_SECRET_KEY='INVALID_KEY')
    response = client.get('/v1/resource/')
    self.assertEqual(response.status_code, 403)
    self.assertEqual(response.data, {'detail': 'Authentication failed.'})

def test_2(self):
    client = APIClient()
    client.credentials(X_SECRET_KEY='FEJ5UI')
    response = client.get('/v1/resource/')
    self.assertEqual(response.status_code, 200)

Однако, когда я тестирую с curl и локально работающий сервер, там нет X_SECRET_KEY заголовок найден в request.META, Это печать None в терминале, пока ожидается получение ключа.

$ curl -X GET localhost:8080/v1/resource/ -H "X_SECRET_KEY=FEJ5UI"
{'detail': 'Authentication failed.'}

Не могли бы вы дать намек, что может быть проблема с этим?

1 ответ

Решение

Переменные заголовков прописные и имеют префикс "HTTP_". Это общее для Django, не знаю о других языках / фреймворках.

См., Например, https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/authentication.py.

Другие вопросы по тегам