Mcrazji 2023-04-10 22:49 采纳率: 0%
浏览 11
已结题

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']

有哪位科学家可为我解惑

  • 写回答

1条回答 默认 最新

  • 阿里嘎多学长 2023-04-10 23:21
    关注

    以下内容部分参考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();
    

    这应该解决你的问题。


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

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月20日
  • 创建了问题 4月10日

悬赏问题

  • ¥60 许可证msc licensing软件报错显示已有相同版本软件,但是下一步显示无法读取日志目录。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加
  • ¥15 用ns3仿真出5G核心网网元