vue+django跨域问题解决方案(前后端两种方案)

版权声明:如有转载复制请注明出处,博主QQ715608270,欢迎沟通交流! https://blog.csdn.net/qq_41000891/article/details/84501280

1.Vue前端设置代理(方案一)


我们在使用vue-cli启动项目的时候npm run dev便可以启动我们的项目了,通常我们的请求地址是以localhost:8080来请求接口数据的,localhost是没有办法设置cookie的。 

我们可以在vue-cli配置文件里面设置一个代理,跨域的方法有很多,通常需要后台来进行配置。我们可以直接通过node.js代理服务器来实现跨域请求。

 vue proxyTable接口跨域请求调试


在vue-cli项目中的config文件夹下的index.js配置文件中,dev长这样子:

dev: {
    env: require('./dev.env'),
    port: 8080,
    autoOpenBrowser: true,
    assetsSubDirectory: 'static',
    assetsPublicPath: '/',
    proxyTable: {},   
    cssSourceMap: false
  }

 服务器提供的接口如果长这样https://www.exaple.com/server_new/login,我们把域名提取出来如https://www.exaple.com

 在config中新建一个文件命名为proxyConfig.js:

module.exports = {
  proxy: {
        '/apis': {    //将www.exaple.com印射为/apis
            target: 'https://www.exaple.com',  // 接口域名
            changeOrigin: true,  //是否跨域
            pathRewrite: {
                '^/apis': ''   //需要rewrite的,
            }              
        }
  }
}

如果本身的接口地址就有 '/api' 这种通用前缀,也就是说https://www.exaple.com/api,就可以把 pathRewrite 删掉。

config文件夹下的index.js引入proxyConfig.js

var proxyConfig = require('./proxyConfig')

config文件夹下的index.js中的dev改成: 

dev: {
    env: require('./dev.env'),
    port: 8080,
    autoOpenBrowser: true,
    assetsSubDirectory: 'static',
    assetsPublicPath: '/',
    proxyTable: proxyConfig.proxy,
    cssSourceMap: false
  }
  

重启npm run dev会发现出现了:

这个时候已经设置好本地API代理了。 

 修改本地hosts文件


window文件路径一般是C:\Window\System32\drivers\etcmac则直接前往文件夹/etc/hosts,打开hosts文件,在这一段下面把localhost设置进去

# localhost name resolution is handled within DNS itself.
# 127.0.0.1       localhost
# ::1             localhost
127.0.0.1                   activate.adobe.com
127.0.0.1                   practivate.adobe.com
127.0.0.1                   lmlicenses.wip4.adobe.com
127.0.0.1                   lm.licenses.adobe.com
127.0.0.1                   na1r.services.adobe.com
127.0.0.1                   hlrcv.stage.adobe.com
 
localhost                   www.exaple.com            

 此时我们已经完全解决了跨域问题,以及本地测试后台无法向我们本地环境设置cookie的情况了。

一种一劳永逸的方法


写一个config.js文件,作为项目地址的配置。

//项目域名地址
const url = 'https://exaple.com';


let ROOT;
//由于封装的axios请求中,会将ROOT打包进去,为了方便之后不再更改,判断了当前环境,而生成的不同的ROOT
if (process.env.NODE_ENV === 'development') {
    //开发环境下的代理地址,解决本地跨域跨域,配置在config目录下的index.js dev.proxyTable中
    ROOT = "/apis"
} else {
    //生产环境下的地址
    ROOT = url;
}

exports.PROXYROOT = url; //代理指向地址
exports.ROOT = ROOT;

这里暴露出去了两个接口,一个作为代理指向地址,也就是真正的请求地址,一个则为我们的ajax请求的地址。

我们将ROOT引入我们配置的ajax中,再将proxyConfig.js修改如下:

const config = require("../src/fetch/config");  //路径你们改下
module.exports = {
  proxy: {
        [config.ROOT]: {    //将www.exaple.com印射为/apis
            target: config.PROXYROOT,,  // 接口域名
            secure: false,  // 如果是https接口,需要配置这个参数
            changeOrigin: true,  //是否跨域
            pathRewrite: {
                [`^${config.ROOT}`]: ''   //需要rewrite的
            }              
        }
  }
}

 之后不管是生产环境,还是开发环境,都不用再修改我们的请求地址了。

也就是说,之前我们的方法,在npm run dev的时候,ajax请求接口地址需要带上/apis,而如果我们在npm run build的时候,则需要将ajax接口地址改为真正的地址www.exaple.com,这样极其不方便,每次都要改。那我们便通过process.env.NODE_ENV来判断环境,从而导出不一样的接口。

2.django后端允许跨域(方案二)

相比前端的设置而言,后端的解决方案就简单多了,我们只需要下载一个python包,进行一些设置,就可以完成跨域访问。

安装django-cors-headers


这个包是用来解决django跨域的,很多语言中,如C#,Java都有对应的跨域包可以安装,而且名字带有cors

通过pip进行安装:

pip3 install django-cors-headers

 

Django项目settings设置

在安装完成后需要进行一些settings的设置:

INSTALLED_APPS = [
    ...
    'corsheaders',
    ...
 ] 

# 添加中间件
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',# 默认
    'django.contrib.sessions.middleware.SessionMiddleware', # 默认

    'corsheaders.middleware.CorsMiddleware',# 默认
    # 注意顺序,即在上一个的下面
    'django.middleware.common.CommonMiddleware', # 新增 ✔

    'django.middleware.csrf.CsrfViewMiddleware',# 默认
    'django.contrib.auth.middleware.AuthenticationMiddleware',# 默认
    'django.contrib.messages.middleware.MessageMiddleware', # 默认
    'django.middleware.clickjacking.XFrameOptionsMiddleware',# 默认
    'django.middleware.common.CommonMiddleware',# 默认
]

# 跨域增加忽略
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_ALLOW_ALL = True
CORS_ORIGIN_WHITELIST = (
    '*'
)
CORS_ALLOW_METHODS = (
    'DELETE',
    'GET',
    'OPTIONS',
    'PATCH',
    'POST',
    'PUT',
    'VIEW',
)
CORS_ALLOW_HEADERS = (
    'XMLHttpRequest',
    'X_FILENAME',
    'accept-encoding',
    'authorization',
    'content-type',
    'dnt',
    'origin',
    'user-agent',
    'x-csrftoken',
    'x-requested-with',
)

在这些设置完成后,同样可以解决跨域的问题。

猜你喜欢

转载自blog.csdn.net/qq_41000891/article/details/84501280