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",
)
Надеюсь, это поможет.