1.何谓跨域?后端接口访问地址是这个,你却偏要用其他域名来访问,这就产生了跨域.
2.如何解决?前端想跨域访问时,首先发送一个OPTION请求询问后端是否允许你跨域,若允许,后端返回响应告知.前端再次把请求发送过来,后端进行处理.
3.django后端如何处理跨域?
第一步,安装第三方扩展:
pip install django-cors-headers
第二步,添加应用:
INSTALLED_APPS = (
...
'corsheaders',
...
)
第三步,中间件处理,注意放在第一条,第一时间进行处理:
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
...
]
第四步,配置访问规则或白名单:
# 允许所有域名跨域(优先选择)
CORS_ORIGIN_ALLOW_ALL = True
# 或配置白名单:
# CORS_ORIGIN_WHITELIST = (
# '*'
# # '127.0.0.1:8000',
# # 'localhost:8000',
# # '127.0.0.1:8080',
# # 'localhost:8080',
# # 'ads-cms-api.aataotao.com:8000' #
# # 'taoduoduo-test.oss-cn-shenzhen.aliyuncs.com:80', # 线上
# # '10.0.2.187:8080' # 本地
# )
第五步,允许携带cookie:
CORS_ALLOW_CREDENTIALS = True
4.注意一个重要问题:
如果使用了nginx,注意正确配置.
sudo vim /usr/local/nginx/conf/nginx.conf
location / {
proxy_pass 127.0.0.1:8000/;
}
5.无需考虑PUT,DELETE,PATCH方法的支持,cors默认都支持.
6.若使用更多复杂配置导致无法访问或各种报错,打开谷歌浏览器调试窗口,针对具体报错逐一解决.
location / {
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET,POST,PUT,DELETE,PATCH,OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Sample-Source';
return 200;
}
proxy_pass http://127.0.0.1:8000;
}