vue和django接口联调

vue访问服务端接口

配置跨域

前端跨域

打开vite.config.js,在和resolve同级的地方添加配置。

proxy代表代理的意思

"/api"是以/api开头的路径走这个配置 

target代表目标

changeOrigin: true,是开启跨域请求

rewrite是编辑路径。

(path) => path.replace(/^\/api/, "")是去掉/api

这样一个路径进来就会被处理,如下:

"/api/config"   -->   "http://localhost:8000/config"

  server: {
    proxy: {
      "/api": {
        target: "http://localhost:8000",
        changeOrigin: true,
        rewrite: (path) => path.replace(/^\/api/, "")
      }
    }
  },

后端跨域

配置api

在utils下新建apis.js文件

注意,我们只配置了/api,所以只有/api开头的路径才能走vite.config.js中的跨域配置。

配置好api文件后记得对外暴露

// 用于访问服务端接口
const apiHost = "/api"


const systemAPIs = {
    sliderListUrl : apiHost + "/system/slider/list", 
}


export{
    systemAPIs
}

访问数据

在app.vue页面中完成访问数据

const bannerList = ref([])
// 访问接口获取数据

const getBannerList = () => {
  ajax.get(systemAPIs.sliderListUrl).then(res => {
    bannerList.value = res.data.objects
    console.log(bannerList.value)
    console.log(res)
  })
}

// 页面元素加载前调用getBannerList函数
onMounted(() => {
  getBannerList()
})

其它问题

获取数据时我们用了res.data.objects,其中objects是后端传回的key值。

配置api的时候注意一定要和后端的路由完全相同,不能有任何区别,包括结尾的/,路由中有那访问路径中也一定要有。

无参数的get在路由的请求结尾已经要加/,有参数的get不能加/

### 如何使用 Vue Django 构建论坛系统 构建一个基于 Vue Django 的论坛系统涉及多个方面的工作,包括后端 API 设计、前端界面实现以及两者的集成。以下是详细的说明: #### 项目结构概述 根据已有的参考资料[^1][^2],可以设计如下项目结构来支持论坛系统的开发需求: ``` forum-system/ ├── backend/ # 后端代码目录(Django) │ ├── forum_app/ # 主应用模块 │ │ ├── migrations/ # 数据库迁移文件 │ │ ├── __init__.py │ │ ├── admin.py # 管理后台配置 │ │ ├── models.py # 数据模型定义 │ │ ├── serializers.py # RESTful 序列化器 │ │ ├── urls.py # URL 路由映射 │ │ └── views.py # 视图逻辑 │ ├── config/ # 配置文件夹 │ │ ├── settings.py # 设置文件 │ │ ├── urls.py # 全局路由配置 │ │ └── wsgi.py │ ├── manage.py # Django 管理脚本 │ └── requirements.txt # Python 依赖项清单 └── frontend/ # 前端代码目录(Vue.js) ├── public/ ├── src/ │ ├── assets/ # 静态资源 │ ├── components/ # 组件目录 │ ├── router/ # 路由配置 │ ├── store/ # Vuex 状态管理 │ ├── views/ # 页面组件 │ └── App.vue └── package.json ``` --- #### 关键技术点解析 ##### 1. **后端部分** - 使用 Django Rest Framework (DRF) 提供 RESTful 接口服务。 - 定义数据模型 `models.py` 来存储帖子、评论等内容[^3]: ```python from django.db import models from django.contrib.auth.models import User class Post(models.Model): title = models.CharField(max_length=255, verbose_name="标题") content = models.TextField(verbose_name="内容") author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='posts', verbose_name="作者") created_at = models.DateTimeField(auto_now_add=True) class Meta: ordering = ['-created_at'] def __str__(self): return self.title class Comment(models.Model): post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments') user = models.ForeignKey(User, on_delete=models.CASCADE) text = models.TextField() created_at = models.DateTimeField(auto_now_add=True) class Meta: ordering = ['created_at'] def __str__(self): return f"{self.user.username} - {self.post.title}" ``` - 编写序列化器 `serializers.py` 将数据库对象转换为 JSON 格式[^4]: ```python from rest_framework import serializers from .models import Post, Comment class CommentSerializer(serializers.ModelSerializer): username = serializers.SerializerMethodField() class Meta: model = Comment fields = ('id', 'text', 'username', 'created_at') def get_username(self, obj): return obj.user.username class PostSerializer(serializers.ModelSerializer): comments = CommentSerializer(many=True, read_only=True) username = serializers.SerializerMethodField() class Meta: model = Post fields = ('id', 'title', 'content', 'username', 'created_at', 'comments') def get_username(self, obj): return obj.author.username ``` - 实现视图集 `views.py` 处理请求并返回响应: ```python from rest_framework.viewsets import ModelViewSet from .models import Post, Comment from .serializers import PostSerializer, CommentSerializer class PostViewSet(ModelViewSet): queryset = Post.objects.all() serializer_class = PostSerializer class CommentViewSet(ModelViewSet): queryset = Comment.objects.all() serializer_class = CommentSerializer ``` - 注册路由 `urls.py` 映射接口路径: ```python from django.urls import include, path from rest_framework.routers import DefaultRouter from .views import PostViewSet, CommentViewSet router = DefaultRouter() router.register(r'posts', PostViewSet) router.register(r'comments', CommentViewSet) urlpatterns = [ path('', include(router.urls)), ] ``` --- ##### 2. **前端部分** - 使用 Vue CLI 初始化项目,并安装必要的插件如 Axios 进行 HTTP 请求[^5]: ```bash vue create frontend cd frontend npm install axios vuex vue-router --save ``` - 创建基础布局导航菜单,在 `App.vue` 中引入全局样式: ```html <template> <div id="app"> <nav>...</nav> <main><router-view /></main> </div> </template> <script> export default { name: "App", }; </script> ``` - 添加页面组件用于展示帖子列表 (`PostList.vue`) 或详情页 (`PostDetail.vue`): ```javascript // 获取帖子列表 async fetchPosts() { const response = await this.$axios.get('/api/posts/'); this.posts = response.data; } ``` - 利用 Vuex 存储用户登录状态或其他共享数据: ```javascript const state = { isAuthenticated: false, }; const mutations = { SET_AUTH(state, status) { state.isAuthenticated = status; }, }; const actions = { async login({ commit }, credentials) { try { const res = await this.$axios.post('/auth/login/', credentials); localStorage.setItem('token', res.data.token); commit('SET_AUTH', true); } catch (error) { console.error(error); } }, }; ``` --- ##### 3. **前后端联调** 通过 CORS 插件允许跨域访问: ```bash pip install django-cors-headers ``` 修改设置文件 `settings.py` 加入中间件: ```python INSTALLED_APPS += ['corsheaders'] MIDDLEWARE.insert(0, 'corsheaders.middleware.CorsMiddleware') CORS_ALLOWED_ORIGINS = ["http://localhost:8080"] ``` 运行服务器验证功能是否正常工作: ```bash # 启动 Django 开发服务器 python manage.py runserver # 启动 Vue 开发模式 npm run serve ``` --- #### 总结 上述方法展示了如何利用 Vue Django 结合搭建一个完整的论坛系统架构。具体实施过程中还需要关注安全性、性能优化等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值