python django配置问题跨域问题,XHR请求没有header导致跨域

python - django,我clone下来label studio的源代码进行部署,使用过程中发现这样的问题,

img

这是一个很明显的跨域问题,这个跨域问题原因不是我在后端没有没有配置 ALLOW_ORIGIN 等等,是这个请求的header丢失了。

img

我是个python 低level人员,不知道为什么header会丢失,我有一种方法可以正常请求。就是浏览器开启disable cache

img

这时这个http请求的header就神奇的出现了

img

因为带着Referer 和 origin ,跨域就通过了。
我想知道这时哪里配置的安全策略么,为什么会出现这种情况,我应该怎么解决。
我能想到的是从django的setting设置中写上什么东西,强制带上referer和origin,或者强制浏览器no-cache。
可是我在这方面造诣低,写不出。我说的是从setting上直接配置那种,不是要深入代码中。

针对CORS配置,我settings文件大概是这样配置的。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.humanize',
    'drf_yasg',
    'corsheaders',
    'django_extensions',
    'django_rq',
    'django_filters',
    'rules',
    'annoying',
    'rest_framework',
    'rest_framework_swagger',
    'rest_framework.authtoken',
    'drf_generators',
    'core',
    'users',
    'organizations',
    'data_import',
    'data_export',
    'projects',
    'tasks',
    'data_manager',
    'io_storages',
    'ml',
    'webhooks',
    'labels_manager',
]

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'core.middleware.DisableCSRF',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'core.middleware.CommonMiddlewareAppendSlashWithoutRedirect',  # instead of 'CommonMiddleware'
    'core.middleware.CommonMiddleware',
    'django_user_agents.middleware.UserAgentMiddleware',
    'core.middleware.SetSessionUIDMiddleware',
    'core.middleware.ContextLogMiddleware',
    'core.middleware.DatabaseIsLockedRetryMiddleware',
    'core.current_request.ThreadLocalMiddleware',
]
# 不使用默认的same-origin 跨域配置,使用以下
SECURE_REFERRER_POLICY = 'origin-when-cross-origin'
# 暴露响应头,xhr才可以拿到响应头
CORS_EXPOSE_HEADERS = (
    'token','origin','referrer'
)
# 缓存options请求
CORS_PREFLIGHT_MAX_AGE = 86400  # 秒
REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'],
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': [
        'core.api_permissions.HasObjectPermission',
        'rest_framework.permissions.IsAuthenticated',
    ],
    'EXCEPTION_HANDLER': 'core.utils.common.custom_exception_handler',
    'DEFAULT_RENDERER_CLASSES': ('rest_framework.renderers.JSONRenderer',),
    'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.NamespaceVersioning',
    'PAGE_SIZE': 100,
    # 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination'
}
SILENCED_SYSTEM_CHECKS += ["rest_framework.W001"]

# CORS & Host settings
# INTERNAL_IPS = [  # django debug toolbar for django==2.2 requirement
# ]
# APPEND_SLASH = True
CORS_ALLOW_ALL_ORIGINS = True
CORS_ORIGIN_ALLOW_ALL = True
# CORS_ALLOW_CREDENTIALS = True  # 解决跨域
SESSION_COOKIE_SECURE = True
SESSION_COOKIE_SAMESITE = None
CORS_ALLOW_METHODS = [
    'DELETE',
    'GET',
    'OPTIONS',
    'PATCH',
    'POST',
    'PUT',
    'VIEW',
]
ALLOWED_HOSTS = ['*','label-studio-server.model-serving.svc.lf10.n.jd.local','11.125.228.46']

有哪位科学家可为我解惑

以下内容部分参考ChatGPT模型:


为了解决这个跨域问题,你需要在Django中配置CORS(跨域资源共享)。

首先,你需要安装django-cors-headers:

pip install django-cors-headers

然后,在settings.py文件中添加以下内容:

INSTALLED_APPS = [
    # 其他应用
    'corsheaders',
]

MIDDLEWARE = [
    # 其他中间件
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
]

CORS_ORIGIN_ALLOW_ALL = True

这将允许来自所有域的请求,并将响应头中的Access-Control-Allow-Origin设置为*。

如果你只想允许来自特定域的请求,可以将CORS_ORIGIN_ALLOW_ALL设置为False,并将CORS_ORIGIN_WHITELIST设置为你要允许的域名列表。

例如:

CORS_ORIGIN_ALLOW_ALL = False

CORS_ORIGIN_WHITELIST = [
    'http://example.com',
    'https://example.com',
]

确保在更改settings.py文件后重新启动Django服务器。

如果你的XHR请求仍然没有头,请确保在JavaScript中设置了withCredentials为true。例如:

var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://example.com/api/data');
xhr.withCredentials = true;
xhr.send();

这应该解决你的问题。


如果我的建议对您有帮助、请点击采纳、祝您生活愉快