Django、vue3、bootstrap,怎么实现前后端分离

以下是使用Django作为后端、Vue 3和Bootstrap作为前端的详细案例。

1. 搭建Django后端

步骤1: 创建Django项目和应用

确保你已经安装了Django。如果没有,通过pip安装:

pip install django

创建Django项目和应用:

django-admin startproject myproject
cd myproject
python manage.py startapp myapp
步骤2: 定义模型

myapp/models.py中定义用户模型:

from django.db import models

class User(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField(unique=True)

    def __str__(self):
        return self.name
步骤3: 配置数据库和迁移

myproject/settings.py中,确保数据库配置正确(Django默认使用SQLite)。

运行迁移来创建数据库表:

python manage.py makemigrations
python manage.py migrate
步骤4: 安装Django REST framework并创建序列化器

安装DRF:

pip install djangorestframework

myproject/settings.pyINSTALLED_APPS中添加rest_framework

myapp目录下创建一个名为serializers.py的文件,并添加序列化器:

from rest_framework import serializers
from .models import User

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['id', 'name', 'email']
步骤5: 创建视图和路由

myapp/views.py中创建视图集:

from rest_framework import viewsets
from .models import User
from .serializers import UserSerializer

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

myapp目录下创建urls.py(如果尚未存在),并配置URLs:

from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import UserViewSet

router = DefaultRouter()
router.register(r'users', UserViewSet)

urlpatterns = [
    path('', include(router.urls)),
]

myproject/urls.py中包含myapp的urls:

from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('myapp.urls')),
]
步骤6: 运行Django服务器
python manage.py runserver

2. 搭建Vue 3前端

步骤1: 安装Vue CLI并创建项目

确保安装了Node.js和npm。然后安装Vue CLI:

npm install -g @vue/cli

创建Vue项目:

vue create myfrontend
cd myfrontend

选择Vue 3预设或创建后手动升级。

步骤2: 安装Bootstrap和Axios
npm install bootstrap
npm install axios

main.jsmain.ts中引入Bootstrap CSS:

import 'bootstrap/dist/css/bootstrap.min.css';
步骤3: Vue 3 组件
完整的 UserList.vue 组件
<template>
  <div class="container mt-5">
    <h1>用户列表</h1>
    <ul class="list-group">
      <li class="list-group-item" v-for="user in users" :key="user.id">
        {{ user.name }} - {{ user.email }}
      </li>
    </ul>
  </div>
</template>

<script>
import axios from 'axios';

export default {
  data() {
    return {
      users: []
    };
  },
  created() {
    this.fetchUsers();
  },
  methods: {
    async fetchUsers() {
      try {
        const response = await axios.get('http://localhost:8000/api/users/');
        this.users = response.data;
      } catch (error) {
        console.error('There was an error fetching the users:', error);
      }
    }
  }
};
</script>

<style scoped>
/* 你可以在这里添加一些样式,如果需要的话 */
</style>

Vue 3 路由配置

如果你打算在Vue应用中有多个页面或视图,你可能需要设置Vue Router。

安装 Vue Router
npm install vue-router@4
创建路由配置

src 目录下创建一个 router 文件夹,并在其中创建一个 index.js 文件:

import { createRouter, createWebHistory } from 'vue-router';
import UserList from '../components/UserList.vue';

const routes = [
  {
    path: '/',
    name: 'UserList',
    component: UserList
  }
  // 你可以在这里添加更多的路由
];

const router = createRouter({
  history: createWebHistory(process.env.BASE_URL),
  routes
});

export default router;
main.jsmain.ts 中使用路由
import { createApp } from 'vue';
import App from './App.vue';
import router from './router';

const app = createApp(App);

app.use(router);

app.mount('#app');

确保跨域请求被允许

由于Django默认不允许跨域请求,你可能需要安装并配置Django CORS headers来允许来自你的Vue开发服务器的请求。

安装 Django CORS Headers
pip install django-cors-headers
myproject/settings.py 中配置
# 在顶部添加
from corsheaders.defaults import default_headers

# 在MIDDLEWARE部分添加
MIDDLEWARE = [
    ...
    'corsheaders.middleware.CorsMiddleware',
    ...
]

# 允许所有源进行CORS请求
CORS_ALLOW_ALL_ORIGINS = True
# 或者,你可以更具体地设置允许的源
# CORS_ALLOWED_ORIGINS = [
#    "http://localhost:8080",
#    "http://127.0.0.1:8080",
#    "http://example.com",
# ]

# 设置允许的HTTP方法
CORS_ALLOW_METHODS = [
    'DELETE',
    'GET',
    'OPTIONS',
    'PATCH',
    'POST',
    'PUT',
]

# 设置允许的HTTP头
CORS_ALLOW_HEADERS = list(default_headers) + [
    'my-custom-header',
]

# 允许携带凭证
CORS_ALLOW_CREDENTIALS = True

现在,当你运行Vue开发服务器(通常是通过 npm run serve)和Django开发服务器时,你的Vue应用应该能够从Django后端获取用户数据,并显示在页面上。确保Vue开发服务器运行在默认的 http://localhost:8080 或你在Django CORS设置中允许的任何其他URL上。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的前后端分离的问答系统的实现步骤: 1. 后端实现 使用Django框架,创建一个新的Django项目和应用,并安装必要的依赖,如`djangorestframework`和`django-cors-headers`。 在应用中创建一个`models.py`文件,定义一个问题`Question`和一个答案`Answer`的模型,如下所示: ```python from django.db import models class Question(models.Model): question_text = models.CharField(max_length=200) class Answer(models.Model): question = models.ForeignKey(Question, on_delete=models.CASCADE) answer_text = models.CharField(max_length=200) ``` 在应用中创建一个`serializers.py`文件,定义一个问题`QuestionSerializer`和一个答案`AnswerSerializer`的序列化器,如下所示: ```python from rest_framework import serializers from .models import Question, Answer class AnswerSerializer(serializers.ModelSerializer): class Meta: model = Answer fields = ('id', 'answer_text') class QuestionSerializer(serializers.ModelSerializer): answers = AnswerSerializer(many=True, read_only=True) class Meta: model = Question fields = ('id', 'question_text', 'answers') ``` 在应用中创建一个`views.py`文件,定义一个问题`QuestionViewSet`和一个答案`AnswerViewSet`的视图集,如下所示: ```python from rest_framework import viewsets from .models import Question, Answer from .serializers import QuestionSerializer, AnswerSerializer class QuestionViewSet(viewsets.ModelViewSet): queryset = Question.objects.all() serializer_class = QuestionSerializer class AnswerViewSet(viewsets.ModelViewSet): queryset = Answer.objects.all() serializer_class = AnswerSerializer ``` 在项目的`settings.py`文件中,配置`INSTALLED_APPS`和`DATABASES`,如下所示: ```python INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', 'corsheaders', 'qa', ] DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', } } CORS_ORIGIN_ALLOW_ALL = True ``` 2. 前端实现 使用Vue.js框架,创建一个新的Vue.js项目,并安装必要的依赖,如`axios`和`bootstrap-vue`。 在项目中创建一个`components`目录,包含一个`QuestionList.vue`和一个`QuestionForm.vue`组件,如下所示: ```vue <template> <div> <b-form @submit.prevent="onSubmit"> <b-form-group label="Question"> <b-form-input v-model="question" required></b-form-input> </b-form-group> <b-button type="submit">Ask</b-button> </b-form> <b-list-group> <b-list-group-item v-for="question in questions" :key="question.id"> <b>{{ question.question_text }}</b> <ul> <li v-for="answer in question.answers" :key="answer.id"> {{ answer.answer_text }} </li> </ul> </b-list-group-item> </b-list-group> </div> </template> <script> import axios from 'axios' export default { data() { return { question: '', questions: [] } }, mounted() { axios.get('http://localhost:8000/api/questions/').then(response => { this.questions = response.data }) }, methods: { onSubmit() { axios.post('http://localhost:8000/api/questions/', { question_text: this.question }).then(response => { this.questions.push(response.data) this.question = '' }) } } } </script> ``` 在项目的`App.vue`文件中,使用`QuestionList`组件,如下所示: ```vue <template> <div class="container py-3"> <h1>Question Answering System</h1> <QuestionList /> </div> </template> <script> import QuestionList from './components/QuestionList.vue' export default { name: 'app', components: { QuestionList } } </script> ``` 3. 运行服务 在命令行中,运行以下命令启动Django开发服务器: ``` python manage.py runserver ``` 在另一个命令行窗口中,运行以下命令启动Vue.js开发服务器: ``` npm run serve ``` 现在,您可以在浏览器中打开`http://localhost:8080`,并使用问答系统进行交互。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值