Django 项目——跨域 CORS 设置

504 阅读1分钟

跨域

  • 跨域指的是跨域名访问,只有域名和端口一致的才算是非跨域;
  • 跨域的几种情况
    • 域名不同
    • 域名相同但是端口不同
    • 二级域名不同
  • 其中,域名相同但是路径不同不属于跨域
  • 跨域问题是针对 ajax 请求的安全限制

跨域解决办法

  • CORS
    • 是一个w3c 标准,全称为“跨域资源共享”(Cross-origin resource sharing)
  • jsonp
  • Nginx 反向代理

CORS 设置

电脑:

sudo vim /etc/hosts

127.0.0.1   api.renran.com   后台
127.0.0.1   www.renran.com   前端

前端

修改配置文件config/index.js

host: 'www.renran.cn', // can be overwritten by process.env.HOST
    port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
    autoOpenBrowser: true,
  

后端

安装模块,虚拟环境

pip install django-cors-headers

设置 settings/dev.py

a. 添加应用

INSTALLED_APPS = (
    ...
    'corsheaders',
    ...
)

b. 中间层在第一个位置加入

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    ...
]

c. 添加白名单

# CORS组的配置信息
CORS_ORIGIN_WHITELIST = (
    'http://www.renran.com:8000',
)
CORS_ALLOW_CREDENTIALS = False  # 不允许ajax跨域请求时携带cookie

完成了上面的步骤,我们就可以通过后端提供数据给前端使用ajax访问了。

引入 axios

前端终端安装 axios

npm i axios -S

配置 axios main.js

import axios from 'axios'; // 从node_modules目录中导入包

// 允许axios发送请求时附带cookie,设置为不允许
axios.defaults.withCredentials = false;

Vue.prototype.$axios = axios; // 把对象挂载vue中

Vue.prototype.$axios = axios; // 把对象挂载vue中