解决CORS问题的两种方式——Django+vue

Django+vue的CORS问题

当前端与后端分处不同的域名,因为客户端访问不同源的服务端时会遭到浏览器的同源策略的拦截,所以我们需要配置CORS,一般开发中配置CORS有2种方案:

  1. web客户端的vue项目中配置vue.config.js实现跨域(使用vite搭建的vue项目,则配置文件是vite.config.js)
  2. api服务端的django项目中配置cors实现跨域

两种方式中可以任选其一,一起配置会冲突。

配置前端的vue.config.js

export default defineConfig({
    plugins: [
        vue(),
        AutoImport({
            resolvers: [ElementPlusResolver()],
        }),
        Components({
            resolvers: [ElementPlusResolver()],
        }),
    ],
    server: {
    	// 这行配置定义了开发服务器监听的端口号,当启动前端项目时,可以通过这个端口访问应用。默认情况下,许多前端项目(如Vue、React)使用3000端口,但这可以根据您的需要进行更改。
        port: '3000',
        // 这行配置定义了开发服务器监听的主机名。通常在本地开发时,我们使用localhost,但如果你想通过特定的域名来访问,可以在这里设置
        host: 'www.local.cn',
        
        proxy: {                         // 跨域代理
            '/api': {                    // 凡是遇到 /api 路径的请求,都映射到 target 属性
                // /api/header/  ---> http://api.luffycity.cn:8000/header/
                target: 'http://api.luffycity.cn:8000/',
                 // target属性定义了实际的后端服务地址,所有匹配到'/api'路径的请求都会被转发到这个地址。例如,如果前端发送请求到 '/api/header/',那么代理会将请求转发到 'http://api.local.cn:8000/header/'。
                changeOrigin: true,      // 是否允许跨域
                ws: true,                // 是否支持websocket跨域
                rewrite: path => path.replace(/^\/api/, '')  // 正则路径替换
            }
        }
    }
});

在前端开发中,跨域代理配置允许本地开发服务器,如Webpack Dev Server或Vite,通过代理功能将特定的API请求转发到实际的后端服务器,从而绕过浏览器的同源策略限制。这种配置利用了跨域资源共享(CORS)机制,通过设置HTTP响应头来允许跨源请求

在代理规则中,可以使用正则表达式来匹配请求路径,并利用rewrite函数来重写URL,移除或替换特定的路径前缀,确保后端服务器能够正确识别和处理请求。此外,changeOrigin选项确保了请求头中的Origin字段与后端服务器域名一致,从而支持跨域请求,而ws: true选项则允许代理转发WebSocket请求,支持实时通信功能。

配置后端的settings.py

  1. 安装django-cors-headers

    pip install django-cors-headers
    
  2. 配置settings.py

    INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    
    'rest_framework',
    'corsheaders',
    
    'home',
    ]
    MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',  # cors跨域的中间件
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ] 
    
  3. 添加客户端访问服务端的白名单,设置允许哪些客户端客户端跨域访问服务端,

    # CORS的配置信息: 
    
    # 方案1:
    # CORS_ORIGIN_WHITELIST = (
    #     'http://www.luffycity.cn:3000',
    # )
    # CORS_ALLOW_CREDENTIALS = False  # 不允许ajax跨域请求时携带cookie
    
    # 方案2:
    CORS_ALLOW_ALL_ORIGINS = True
    

在Django项目中,通过集成django-cors-headers库并对其进行配置,可以实现跨域资源共享(CORS)。首先,将corsheaders添加到INSTALLED_APPS中启用该应用,然后在MIDDLEWARE中包含CorsMiddleware以启用中间件处理CORS请求。设置CORS_ALLOW_ALL_ORIGINS = True允许所有域名进行跨域访问,而CORS_ALLOW_CREDENTIALS = True则允许跨域请求携带凭证,如Cookies.对于需要用户认证和保持会话状态的Web应用至关重要。

利用 HTTP 头来控制资源的共享策略,使得不同源的网页能够安全地请求和接收来自另一个源的资源。这是通过在服务器端设置响应头来实现的,而不是在客户端,因此它是一种服务器端的解决方案。

若有错误与不足请指出,关注DPT一起进步吧!!!

很高兴为你提供一个Django+Vue3+ElementPlus前后端分离的demo。 ## 后端部分 首先,我们需要创建一个Django项目。在命令行中输入以下命令: ``` django-admin startproject project_name ``` 然后,我们需要创建一个应用程序。在命令行中输入以下命令: ``` python manage.py startapp app_name ``` 接下来,我们需要安装一些必要的库。在命令行中输入以下命令: ``` pip install djangorestframework django-cors-headers ``` 接下来,我们需要在`settings.py`文件中添加以下代码: ```python INSTALLED_APPS = [ ... 'rest_framework', 'corsheaders', 'app_name', ] MIDDLEWARE = [ ... 'corsheaders.middleware.CorsMiddleware', 'django.middleware.common.CommonMiddleware', ] CORS_ORIGIN_ALLOW_ALL = True ``` 现在,我们已经完成了后端部分的设置。我们可以开始编写API。 在`app_name`中创建一个名为`api.py`的文件,并编写以下代码: ```python from rest_framework.decorators import api_view from rest_framework.response import Response @api_view(['GET']) def hello_world(request): return Response({"message": "Hello, World!"}) ``` 这是一个简单的API,当我们向`/api/hello`发送GET请求时,它将返回一个JSON响应,其中包含“Hello, World!”消息。 最后,在`urls.py`文件中添加以下代码: ```python from django.urls import path from . import api urlpatterns = [ path('api/hello', api.hello_world), ] ``` 现在,我们已经完成了后端部分的设置。我们可以在终端中运行`python manage.py runserver`命令来启动服务器。 ## 前端部分 首先,我们需要安装Vue CLI。在命令行中输入以下命令: ``` npm install -g @vue/cli ``` 然后,我们需要创建一个Vue项目。在命令行中输入以下命令: ``` vue create project_name ``` 接下来,我们需要安装ElementPlus。在命令行中输入以下命令: ``` npm i element-plus -S ``` 接下来,我们需要在`main.js`文件中添加以下代码: ```javascript import { createApp } from 'vue' import App from './App.vue' import ElementPlus from 'element-plus' import 'element-plus/lib/theme-chalk/index.css' createApp(App).use(ElementPlus).mount('#app') ``` 现在,我们已经完成了前端部分的设置。我们可以开始编写页面。 在`src`中创建一个名为`HelloWorld.vue`的文件,并编写以下代码: ```vue <template> <div> <h1>{{ message }}</h1> </div> </template> <script> export default { data() { return { message: '' } }, created() { fetch('http://localhost:8000/api/hello') .then(response => response.json()) .then(data => this.message = data.message) } } </script> ``` 这是一个简单的页面,它将从我们的API中获取消息并显示在页面上。 最后,在`App.vue`文件中添加以下代码: ```vue <template> <HelloWorld /> </template> <script> import HelloWorld from './components/HelloWorld.vue' export default { components: { HelloWorld } } </script> ``` 现在,我们已经完成了前端部分的设置。我们可以在终端中运行`npm run serve`命令来启动前端服务器。 现在,我们可以在浏览器中访问`http://localhost:8080`,应该可以看到一个页面,其中包含“Hello, World!”消息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叫我DPT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值