python - 如何解决我的 Django API 的 CORS 问题?
问题描述
我无法在我的 Django API 中解决 CORS 问题。当我调用此 API 时,出现错误:
CORS 策略已阻止从源“ http ://localhost:8000/ ”获取访问权限:对预检请求的响应未通过访问控制检查:否 'Access-Control-Allow- Origin' 标头存在于请求的资源上。如果不透明的响应满足您的需求,请将请求的模式设置为“no-cors”以获取禁用 CORS 的资源。
为了启用 CORS,我做pip install django-cors-headers
了并将以下代码添加到settings.py
:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'corsheaders',
]
MIDDLEWARE_CLASSES = [
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
CORS_ORIGIN_WHITELIST = [
'localhost:80',
'localhost:8000',
'127.0.0.1:8000'
]
我应该说我在 Docker 上运行我的项目。这是docker-compose.yml
:
version: '2'
services:
django-docker:
build:
context: .
dockerfile: Dockerfile.django
container_name: my.django
image: my-django
ports:
- 8000:8000
webapp-docker:
build:
context: .
dockerfile: Dockerfile.webapp
container_name: my.webapp
image: my-web
ports:
- 80:80
解决方案
您需要将corsheaders.middleware.CorsMiddleware
中间件添加到中间件类中settings.py
:
MIDDLEWARE_CLASSES = (
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.BrokenLinkEmailsMiddleware',
'django.middleware.common.CommonMiddleware',
#...
)
django.middleware.common.CommonMiddleware
您的中间件类中有重复项。
然后,您可以通过添加以下设置为所有域启用 CORS:
CORS_ORIGIN_ALLOW_ALL = True
或仅对指定域启用 CORS:
CORS_ORIGIN_ALLOW_ALL = False
CORS_ORIGIN_WHITELIST = (
'http://localhost:8000',
)
推荐阅读
- android - 长按RecyclerView时让ImageView出现,释放时消失?
- php - 你仍然可以使用 PDO::quote() 被黑客入侵吗?
- angular - Angular 材质 mat-menu 多次复制内部组件
- javascript - 如何在php中回显ajax变量?
- node.js - 带有 vhost 和 greenlock-express 的 NodeJS 子域
- javascript - 进行多个快速 API 调用而不发送垃圾邮件的最有效方法?
- scala - Spark 结构化流中的 LocalTableScan 有什么用?
- python - 无法使用终端将本地 Python 文件复制到 HIVE
- swift - 让编辑按钮到我需要的地方
- javascript - 合并手风琴菜单和jQuery轮播