You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django+Svelte通过ngrok测试时CORS跨域问题求助

Django+Svelte跨域问题排查(ngrok隧道环境)

问题现象

本地运行Django+Svelte平台无异常,但通过ngrok隧道供外部测试时,触发CORS错误:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://452c-102-159-49-36.ngrok-free.app/api/courses/. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing). Status code: 200

相关代码与配置

Svelte组件API调用代码

async function fetchCourseOptions() {
  try {
    const response = await fetch(
      "https://452c-102-159-49-36.ngrok-free.app/api/courses/"
    );
    const data = await response.json();
    courseSelected = true;
    return data.courses;
  } catch (error) {
    console.error("Error while fetching course options:", error);
    return [];
  }
}

ngrok隧道配置

tunnels:
  django:
    proto: http
    addr: 127.0.0.1:8000
  svelte:
    proto: http
    addr: 5173

ngrok转发域名

Forwarding                    https://25fc-102-159-49-36.ngrok-free.app -> http://localhost:5173                                                      
Forwarding                    https://452c-102-159-49-36.ngrok-free.app -> http://127.0.0.1:8000  

Django settings.py相关配置

ALLOWED_HOSTS = ["452c-102-159-49-36.ngrok-free.app", "localhost"]


# Application definition

INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "profikapp.apps.ProfikappConfig",
    "smart_selects",
    "api.apps.ApiConfig",
    "corsheaders",
]

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

ROOT_URLCONF = "profik.urls"

CORS_ALLOWED_ORIGINS = [
    "http://localhost:5173",
    "https://25fc-102-159-49-36.ngrok-free.app",
    "https://452c-102-159-49-36.ngrok-free.app",
    "https://5ab8-102-159-49-36.ngrok-free.app",
]

排查方向

  • CORS中间件顺序错误:corsheaders.middleware.CorsMiddleware必须放在django.middleware.common.CommonMiddleware之前,当前配置中它在末尾,会导致CORS头无法正确注入。调整MIDDLEWARE顺序,将corsheaders.middleware.CorsMiddleware移至django.middleware.common.CommonMiddleware上方。
  • ngrok域名动态变化:ngrok每次启动会生成新域名,当前CORS_ALLOWED_ORIGINS中的旧域名可能已失效,或朋友测试用的是未配置的新域名。可临时设置CORS_ALLOW_ALL_ORIGINS = True验证问题,确认后添加正确的新域名到配置中。
  • Django服务器未重启:修改settings.py后必须重启Django开发服务器,否则新配置不会生效。
  • 请求来源不匹配:确认朋友实际访问的Svelte域名是否为https://25fc-102-159-49-36.ngrok-free.app,若为其他新生成的域名,需补充到CORS_ALLOWED_ORIGINS。
  • 协议一致性问题:确保CORS_ALLOWED_ORIGINS中的域名均为https开头,与ngrok默认的HTTPS协议一致,避免写成HTTP。

内容的提问来源于stack exchange,提问作者Lord nader

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 21:27:50