在Django中使用CORS进行跨域资源共享

2023-04-11 00:00:00 django cors 资源共享

CORS全称是跨域资源共享,用于解决在客户端使用AJAX进行跨域请求时的安全限制问题。

在Django中,我们可以使用django-cors-headers库来实现CORS。

安装:

pip install django-cors-headers

在settings.py中添加中间件和配置:

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

CORS_ORIGIN_ALLOW_ALL = True # 允许所有来源  
CORS_ALLOW_CREDENTIALS = True # 允许携带cookie  
CORS_ORIGIN_WHITELIST = [ # 白名单,允许特定来源  
  'http://pidancode.com',  
]  
CORS_ORIGIN_REGEX_WHITELIST = [ # 正则表达式白名单  
  r'^(https?://)?(\w+\.)?google\.com$',  
]  
CORS_ALLOW_METHODS = [ # 允许的请求方法  
  'DELETE',  
  'GET',  
  'OPTIONS',  
  'PATCH',  
  'POST',  
  'PUT',  
]  
CORS_ALLOW_HEADERS = [ # 允许的请求头  
  'accept',  
  'accept-encoding',  
  'authorization',  
  'cache-control',  
  'content-type',  
  'origin',  
  'referer',  
  'user-agent',  
]  
CORS_PREFLIGHT_MAX_AGE = 86400 # OPTIONS请求缓存时间  

代码演示:

views.py

from django.http import JsonResponse  

def index(request):  
  data = {'message': 'Hello, CORS!'}  
  return JsonResponse(data)

urls.py

from django.urls import path  
from . import views  

urlpatterns = [  
  path('index', views.index, name='index'),  
]

以上代码会在/index路径下返回JSON格式的数据{'message': 'Hello, CORS!'}。

如果需要限制来源,可以使用CORS_ORIGIN_WHITELIST或CORS_ORIGIN_REGEX_WHITELIST。例如:

CORS_ORIGIN_WHITELIST = [  
  'http://pidancode.com',  
]

这样只允许来自http://pidancode.com的请求。如果需要同时允许多个来源,可以使用逗号分隔。

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

如果需要使用正则表达式匹配多个来源,可以使用CORS_ORIGIN_REGEX_WHITELIST。

CORS_ORIGIN_REGEX_WHITELIST = [  
  r'^(https?://)?(\w+\.)?google\.com$',  
  r'^(https?://)?(\w+\.)?example\.com$',  
]

这样只允许来自google.com和example.com的请求。

如果需要限制请求方法和请求头,可以使用CORS_ALLOW_METHODS和CORS_ALLOW_HEADERS。

CORS_ALLOW_METHODS = [  
  'GET',  
  'POST',  
]  
CORS_ALLOW_HEADERS = [  
  'accept',  
  'content-type',  
]

这样只允许GET和POST请求,并且只允许Content-Type和Accept请求头。

注意,如果使用cookie,请把CORS_ALLOW_CREDENTIALS设为True。

CORS_ALLOW_CREDENTIALS = True

这样可以携带cookie进行跨域请求。

最后,如果需要缓存OPTIONS请求的结果,可以使用CORS_PREFLIGHT_MAX_AGE设置缓存时间。

CORS_PREFLIGHT_MAX_AGE = 86400

相关文章