【问题标题】:Adding 'x-total-count' with django corsheaders使用 django corsheaders 添加“x-total-count”
【发布时间】:2026-01-19 04:10:01
【问题描述】:

如何在我的 django cors 响应标头中添加“x-total-count”?

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'corsheaders',
    'rest_framework',
    'languages'

]

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

CORS_ALLOW_HEADERS = [
    'x-total-count',
    'accept-encoding',
    'authorization',
    'content-type',
    'dnt',
    'origin',
    'user-agent',
    'x-csrftoken',
    'x-requested-with',


]


CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True

CORS_ALLOW_METHODS = [
    'DELETE',
    'GET',
    'OPTIONS',
    'PATCH',
    'POST',
    'PUT',
]

。 . .

这就是我的 setting.py 的样子

这是错误的样子:

警告:缺少键的翻译:“X-Total-Count 标头是 HTTP 响应中缺少。 jsonServer 数据提供者期望 包含此标头的资源列表的响应 构建分页的结果总数。如果您正在使用 CORS,您是否在 Access-Control-Expose- 中声明了 X-Total-Count- 标头标头"

即使我查看了许多相关问题,我也无法解决这个问题。 django cors-headers 文档不包含如何添加“x-total-count”的指南

【问题讨论】:

  • 您的应用程序是否在代理/防火墙后面运行?他们倾向于过滤标题并且只允许某些标题信息。你能验证 django 没有提供标头吗?
  • 前端和后端都在本地主机上运行,​​因此没有代理/防火墙。我在获取服务器请求时得到的响应标头如下所示:Access-Control-Allow-Origin: * Content-Length: 0 Content-Type: text/html; charset=utf-8 日期:2019 年 8 月 6 日星期二 10:37:43 GMT 位置:/languages/?_end=10&_order=DESC&_sort=id&_start=0 服务器:WSGIServer/0.2 CPython/3.6.5 变化:来源
  • 抱歉不知道那个包,但是检查github.com/ottoyiu/django-cors-headers/blob/…好像你也必须设置CORS_EXPOSE_HEADERS
  • 这就是我所做的。还是一样的错误..
  • 您的 API 是返回标头 X-Total-Count 还是使用 Content-Range

标签: django react-admin django-cors-headers


【解决方案1】:

简单的解决方案是https://github.com/bmihelac/ra-data-django-rest-framework 它就像魔术一样工作。希望这有用。

【讨论】:

    【解决方案2】:

    为了使 React Admin 与 Django REST 框架一起工作,我们必须设置一些自定义分页、标题等

    例如,这是我对这些文件的实现:

    # pagination.py
    from collections import OrderedDict
    from rest_framework.response import Response
    from rest_framework.pagination import PageNumberPagination
    
    
    class ReactAdminPagination(PageNumberPagination):
        page_query_param = "page"
        page_size_query_param = "perPage"
    
        def get_paginated_response(self, data):
            count = self.page.paginator.count
            item_starting_index = self.page.start_index() - 1
            item_ending_index = self.page.end_index() - 1
    
            content_range = "items {0}-{1}/{2}".format(
                item_starting_index, item_ending_index, count
            )
    
            headers = {"Content-Range": content_range}
    
            return Response(
                OrderedDict(
                    [
                        ("count", count),
                        ("next", self.get_next_link()),
                        ("previous", self.get_previous_link()),
                        ("results", data),
                    ]
                ),
                headers=headers,
            )
    
    # filtering.py
    import json
    from django_filters.rest_framework import DjangoFilterBackend
    
    
    def sort_queryset(queryset, value):
        try:
            [field, order] = json.loads(value)
        except json.decoder.JSONDecodeError:
            return queryset
    
        if field and order:
            return queryset.order_by(f"-{field}" if order == "DESC" else field)
    
        return queryset
    
    
    def filter_queryset_for_multiple(queryset, key, value):
        filter_params = {}
        filter_params[key] = value.split(",")
        return queryset.filter(**filter_params)
    
    
    def filter_queryset_for_nullable(queryset, key, value):
        nullable = True if value == "true" else False if value == "false" else None
    
        if nullable is None:
            return queryset
    
        filter_params = {}
        filter_params[key] = nullable
        return queryset.filter(**filter_params)
    
    
    def filter_queryset_for_reference(queryset, key, value):
        f = True if value == "true" else False if value == "false" else value
    
        filter_params = {}
        filter_params[key] = f
        return queryset.filter(**filter_params)
    
    
    class ReactAdminFilterBackend(DjangoFilterBackend):
        def get_filterset_kwargs(self, request, queryset, view):
            for key, value in request.query_params.items():
                if key == "sort" and value:
                    queryset = sort_queryset(queryset, value)
                elif key.endswith("__in"):
                    queryset = filter_queryset_for_multiple(queryset, key, value)
                elif key.endswith("__isnull"):
                    queryset = filter_queryset_for_nullable(queryset, key, value)
                elif "__" in key:
                    queryset = filter_queryset_for_reference(queryset, key, value)
    
            return {"data": request.query_params, "queryset": queryset, "request": request}
    

    【讨论】:

    • 这个解决方案有效吗?除了作者,有没有人试过。还是谢谢