当我们在使用Django作为Web框架开发时,常常会涉及到跨域请求的问题.本篇攻略将介绍如何在Django中实现跨域请求,并附带两个示例进行详细说明.
所谓跨域请求,简单说就是在一个域名下,通过ajax等方式向其他域名的服务器请求数据.例如,我们的前端页面在www.example.com域名下,但是需要请求api.example.com域名下的数据.
要在Django中实现跨域请求,需要进行如下操作:
① 安装django-cors-headers
django-cors-headers是一个用于处理跨域请求的Django插件,可以方便快捷地实现跨域请求.可以使用pip等方式进行安装:
pip install django-cors-headers
在项目的settings.py文件中,将corsheaders添加到INSTALLED_APPS中:
INSTALLED_APPS = [
# ...
'corsheaders',
# ...
]
在settings.py文件中,找到MIDDLEWARE,加入如下中间件:
MIDDLEWARE = [
# ...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
# ...
]
在settings.py文件中,加入如下配置项:
CORS_ORIGIN_ALLOW_ALL = True
这个配置项的作用是允许所有的域名都可以跨域请求,如果想要限制部分域名跨域请求,需要设置CORS_ORIGIN_WHITELIST.
以上四步操作完成后,就可以在Django中进行跨域请求了.
以下是前后端分离项目的大致结构:
backend/
│
├── app/
│ ├── views.py
└── backend/
├── settings.py
└── frontend/
├── dist/
├── src/
├── public/
└── package.json
其中,backend文件夹是Django项目的根目录;frontend是前端项目的根目录,app是Django的app,其中views.py中定义了以下接口:
from django.http import JsonResponse
def hello(request):
return JsonResponse({'hello': 'world'})
现在的需求是,前端页面需要向Django的/hello接口发起跨域请求.
在settings.py文件中,加入以下配置项:
CORS_ORIGIN_WHITELIST = [
"http://localhost:8080",
"http://12⑦0.0.1:8080"
]
在前端页面的main.js文件中,使用以下代码进行跨域请求:
fetch('http://12⑦0.0.1:8000/hello', {
mode: 'cors',
headers: {
'Content-Type': 'application/json',
},
})
.then(response => response.json())
.then(data => console.log(data))
其中,mode:'cors'表示使用cors方式请求,headers中指定了请求的Content-Type.
在前端页面中,可以使用jQuery的ajax方法进行跨域请求.以请求Django接口为例,代码如下:
$.ajax({
type: 'GET',
url: 'http://12⑦0.0.1:8000/hello',
crossDomain: true,
dataType: 'json',
success: function(data) {
console.log(data);
}
})
其中,crossDomain:true表示开启跨域请求,dataType指定了返回的数据类型.
CORS_ALLOW_METHODS = [
'GET',
]
这个配置项的作用是指定允许跨域的请求方法,如果不指定,默认所有方法都允许.
通过以上两个示例,我们可以看到,在Django项目中,使用django-cors-headers插件实现跨域请求非常方便.