Django REST и react-admin: Отсутствует заголовок Content-Range

Используя ra-data-simple-rest DataProvider от react-admin, я хочу сделать запрос к REST api от django. В Django я создал следующий класс пагинации, который должен отображать заголовок Content-Range, требуемый DataProvider:

from rest_framework import pagination
from rest_framework.response import Response

class ContentRangeHeaderPagination(pagination.PageNumberPagination):

    def get_paginated_response(self, data):

        total_items = self.page.paginator.count # total no of items in queryset
        item_starting_index = self.page.start_index() - 1 # In a page, indexing starts from 1
        item_ending_index = self.page.end_index() - 1

        content_range = 'posts: {0}-{1}/{2}'.format(item_starting_index, item_ending_index, total_items) 

        headers = {'Content-Range': content_range} 

        return Response(data, headers=headers)

В настройках Django я поставил следующее:

INSTALLED_APPS = [
    ...
    'corsheaders',
    'rest_framework',
]


MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    ...
]

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': '<myProject>.pagination.ContentRangeHeaderPagination',
    'PAGE_SIZE': 10
}

CORS_ALLOWED_ORIGINS = [
    'http://127.0.0.1:5173',
]

CORS_ALLOW_HEADERS = (
    "accept",
    "range",
    "content-range",
    "authorization",
    "content-type",
    "user-agent",
    "x-csrftoken",
    "x-requested-with",
)

Я постоянно получаю ошибку «В HTTP-ответе отсутствует заголовок Content-Range. Простой поставщик данных REST ожидает, что ответы для списков ресурсов будут содержать этот заголовок с общим количеством результатов для построения пагинации». Если вы используете CORS, объявили ли вы Content-Range в заголовке Access-Control-Expose-Headers?"

Есть идеи, что я делаю не так?

К сожалению, поставщик данных ra-data-django-rest-framework довольно устарел, и я получаю довольно много конфликтов зависимостей, пытаясь установить его.

Наконец-то я нашел решение своей проблемы: Вы должны явно выставить content-range-header в настройках django следующим образом:

CORS_EXPOSE_HEADERS = (
    "content-range",
)

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

from corsheaders.defaults import default_headers

CORS_ALLOW_HEADERS = (
    *default_headers,
    "range",
)

Надеюсь, это поможет.

Вернуться на верх