Я не могу получить свой токен в разрешениях, хотя я его отправил. Django rest framework

Я создал простой класс разрешения для защиты моего представления.

class StaffOnly(permissions.BasePermission):

    def has_permission(self, request, view):
        token = request.META.get('HTTP_TOKEN', False) # Always returns False 
        user = CustomUser.objects.filter(token=token) # Which means no user found
        if user.exists(): # This line won`t execute
            user = user.get(token=token)
            return user.role > 0 
        else:
            raise PermissionDenied('No token')

Сам вид:

@api_view(["GET"])
@permission_classes([StaffOnly])
def book_list(request):
    book_list = InfoBook.objects.all()
    serializer_list = InfoBookSerializer(book_list, many=True)
    return Response(data=serializer_list.data, status=status.HTTP_200_OK)

Потом я пытался отправить запрос со стороны клиента.

// This is the part of React`s Component`s code. I`m sure that I`m not sending blank token and url is correct

        fetch(HTTP + DOMAIN + API + VERSION + GETBOOKS, {
            headers: {
                "Token" : props.token 
            }
        })
          .then(res=>res.json())
          .then(data => setBooks(data))

К сожалению, мой класс разрешения всегда отказывает в доступе, поскольку не предоставлен токен. Как видите, яm sending propriate header and I still can`по какой-то причине не могу получить к нему доступ.

Потому что яm sort of newbie I don``tне знаю причины, почему это происходит.

Я понял, что я не могу получить доступ к моему токен-заголовку в классе разрешения, но я могу получить доступ к нему внутри представления.

# Client`s side request is the same
@api_view(["GET"])
# @permission_classes([StaffOnly]) # disable security from view 
def book_list(request):
    token = request.META.get('HTTP_TOKEN', False) # access token manually 
    print(token) # terminal output is Xg3Fk9DZkpInRvaOipS6UZg9D0x90xV...
    book_list = InfoBook.objects.all()
    serializer_list = InfoBookSerializer(book_list, many=True)
    return Response(data=serializer_list.data, status=status.HTTP_200_OK)

Я просто хотел создать класс разрешения безопасности, который будет проверять определенный заголовок с именем "Token" и давать или запрещать разрешение. Я столкнулся с проблемой, когда этот класс просто не может получить доступ к этому заголовку, который сам по себе легко доступен.

После того как я несколько часов возился с этой проблемой, я наконец нашел решение!

Проблема в том, что к моему представлению "book_list" отправляется не только GET-запрос, но и OPTIONS-запрос. Запрос OPTION - это своего рода настройка, которая всегда идет перед фактическим запросом. И он не содержит никакой информации о HEADERS DATA, ONLY HEADERS NAMES.

При этом реальное решение будет выглядеть следующим образом:

class StaffOnly(permissions.BasePermission):

def has_permission(self, request, view):
    if request.method == "OPTIONS": 
        return True #always return true if this is the option request
    #in other case start checking permissions
    token = request.META.get('HTTP_TOKEN', False) 
    user = CustomUser.objects.filter(token=token)
    if user.exists():
        user = user.get(token=token)
        return user.role > 0
    else:
        return False
Вернуться на верх