python - django,我clone下来label studio的源代码进行部署,使用过程中发现这样的问题,
这是一个很明显的跨域问题,这个跨域问题原因不是我在后端没有没有配置 ALLOW_ORIGIN 等等,是这个请求的header丢失了。
我是个python 低level人员,不知道为什么header会丢失,我有一种方法可以正常请求。就是浏览器开启disable cache
这时这个http请求的header就神奇的出现了
因为带着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']
有哪位科学家可为我解惑