保姆级教程:Vue3 + Django + MySQL 前后端联调(PyCharm+VSCode版)

该文章已生成可运行项目,

一、环境准备与验证

这里为减少篇幅,默认大家都安装好了这些软件。不会下载安装的,教程也很多,这里不再做赘述。话不多说,咱们开始:

1. 安装验证

确保已安装以下软件并验证版本:

# 验证Node.js
node -v  # 应显示v16.x或更高,我安装的是v20.18.0
npm -v

# 验证Python
python --version  # 应显示3.8.x或更高,这是 Django 5.0 支持的最低版本。我用的3.12.9
pip --version

# 验证MySQL
mysql --version

2. 开发工具准备

  • PyCharm专业版:用于Django后端开发
  • VSCode:用于Vue前端开发
  • Navicat(可选):数据库可视化工具

 二、MySQL数据库配置 

如果有数据库可视化工具就直接点点点创建即可,这里不做赘述,只说明如何用命令行创建:

mysql -u root -p //登录数据库,回车后输入密码即可

CREATE DATABASE fullstack;  //创建数据库,注意分号结尾

SHOW DATABASES; //产看数据库是否创建成功

 示例:

注意,这里不用手动创建数据表或者使用原生SQL语句,下面在Django 中定义模型类并通过迁移系统创建表。这就是我们常说的ORM(对象关系映射)

 三、后端项目初始化(PyCharm)

这里有两种方法,专业版的可以直接手动创建,不是专业版的可以用另一种命令行创建的方法。

  • 这里推荐大家学习使用如何用命令行创建,能够学到关于虚拟环境的创建方法。虚拟环境对于我们日后的学习如何管理python项目很有用。
  • 在虚拟环境中安装的库不会影响全局 Python 环境和其他虚拟环境。这样就可以为每个项目精确地安装所需的依赖,避免了不同项目之间依赖库版本的冲突。
  • 而且可以通过导出虚拟环境中的依赖列表(使用 pip freeze > requirements.txt 命令),来快速重建相同的环境

1. 创建Django项目

手动创建:

  1. 打开PyCharm → New Project
  2. 选择"Django"项目类型
  3. 配置:
    • Location: your-path/backend
    • Python解释器:选择3.8+
    • 勾选"Create virtual environment"
    • Django版本:5.0.3
  4. 点击Create

命令行创建 

首先创建一个虚拟环境,注意我这里使用 conda 创建虚拟环境。

conda create -n django_env python=3.12.9  //创建虚拟环境

conda activate django_env //激活虚拟环境

pip install django==5.0.3 //安装必要库

mkdir fullstack-project //创建文件夹,存放前后端项目文件

cd fullstack-project //切换到文件夹

django-admin startproject backend  //命令行创建项目文件

python manage.py startapp Login  //创建登录应用

pip install django-cors-headers mysqlclient// 在该虚拟环境下安装必要依赖 

其中: 

  • django-cors-headers:用于解决 Django 项目中的跨域问题,配置灵活,使用简单。
  • mysqlclient:用于 Python 连接 MySQL 数据库,性能优越,功能强大,是 Django 推荐的 MySQL 数据库驱动之一。

 用PyCharm打开即可看到目录结构长这样:

2.配置项目

修改 backend/settings.py:

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

MIDDLEWARE = [
   
    'corsheaders.middleware.CorsMiddleware',#需注意与其他中间件顺序,这里放在最前面即可
      ...
]

# 允许所有域名跨域访问(开发环境使用,生产环境需要配置具体域名)
CORS_ORIGIN_ALLOW_ALL = True

# 数据库配置
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'fullstack',  //要创建的数据库名,我用的是fullstack
        'USER': 'your_mysql_username',  //数据库用户名
        'PASSWORD': 'your_mysql_password',  //数据库密码
        'HOST': 'localhost',
        'PORT': '3306',
    }
}

3.模型定义(Login/models.py)

也就是通过简答的代码创建数据表,简单解释下:

  1. 将数据库表映射为类:每个数据库表对应一个类(称为模型类)。
  2. 将表中的记录映射为对象:表中的每一行数据对应一个对象实例。
  3. 通过对象操作数据库:开发者可以通过操作对象来实现对数据库的增、删、改、查操作,而无需直接编写 SQL 语句。
(Login/models.py)

from django.db import models

# Create your models here.
class User(models.Model):
    username = models.CharField(max_length=50)
    password = models.CharField(max_length=50)

编写完后打开终端cd到当前目录下,我们要创建迁移文件并应用迁移,也就是让代码生效:

# 创建迁移文件并应用迁移
python manage.py makemigrations
python manage.py migrate

示例:

如果这时候你安装有可视化数据库软件,打开刷新即可看到 :

4.创建视图 (Login/views.py)

from rest_framework import status
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import User

class RegisterView(APIView):
    def post(self, request):
        username = request.data.get('username')
        password = request.data.get('password')
        if username and password:
            user = User.objects.create(username=username, password=password)
            return Response("User created successfully", status=status.HTTP_201_CREATED)
        else:
            return Response("Username and password are required", status=status.HTTP_400_BAD_REQUEST)

5.配置URL

注意:这里需要配置两处urls。除默认创建好的,还要在Login目录下手动创建一个urls.py文件,注意区分!具体配置如下:

(backend/urls.py) 
from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('Login/', include('Login.urls')),
]

(backend/Login/urls.py)
from django.urls import path
from .views import RegisterView

urlpatterns = [
    path('register/', RegisterView.as_view(), name='register'),
]

 6.启动后端

在完成上面操作后,在终端当前目录下,运行以下命令,启动后端:

python manage.py runserver

 示例:

四、前端项目初始化(VSCode)

1.创建vue3项目

这里记得进入到目录fullstack-project下

进入目录后运行以下命令:注意这个命令是安装Node.js中之后才能运行的。这一指令将会安装并执行 create-vue,它是 Vue 官方的项目脚手架工具。你将会看到一些诸如 TypeScript 和测试支持之类的可选功能提示:

如果不知道怎么选的按我这个就行,然后回车应该还会有功能,不用再空格选了,直接回车。frontend创建好后进入该目录,然后按提示依次运行命令即可:

注意:npm run format 是一个用于代码格式化的命令,通常用于确保代码风格一致。它并不是启动项目的必要步骤。这里直接跳过,运行启动命令即可正常启动。

运行命令启动看是否创建成功,点击出现的默认url:

npm run dev

示例:

2.配置项目 

VS Code打开刚创建好的前端项目,这里还要做一些小配置,为前后端联调做准备。

Ctrl+` 打开终端,安装以下依赖项,其中,axios 用于与后端进行数据交互,vue-router 用于实现页面的路由管理

npm install axios vue-router

安装好后还要手动修改一下目录结构:

frontend/
├── src/
│   ├── api/            # API请求封装
│   ├── router/         # 路由配置
│   ├── views/          # 页面组件
│   ├── App.vue
│   └── main.ts

然后将main.ts中的第一行样式注销:这是为了防止默认样式干扰操作。

配置代理 (解决跨域)

在 frontend/vite.config.js 中添加:

import { fileURLToPath, URL } from 'node:url'

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueDevTools from 'vite-plugin-vue-devtools'

// https://vite.dev/config/
export default defineConfig({
  plugins: [
    vue(),
    vueDevTools(),
  ],
  resolve: {
    alias: {
      '@': fileURLToPath(new URL('./src', import.meta.url))
    },
  },
  server: {
    proxy: {
      '/api': {
        target: 'http://localhost:8000',
        changeOrigin: true,
      }
    }
  }
  
})

3.创建注册页面 

这里为方便直接在App.vue文件中作修改。拿去复制即可:

<template>

  <div class="container">
    <div class="box">
      <div class="header">
        <h2>欢迎注册</h2>

         <svg t="1743150356672" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"
          p-id="4191" width="48" height="48">
          <path
            d="M767.818667 409.173333C867.338667 444.266667 938.666667 539.136 938.666667 650.666667c0 42.709333-10.496 83.978667-30.261334 120.842666-1.792 3.338667-4.992 8.928-9.696 16.96l14.613334 53.557334c6.506667 23.893333-15.402667 45.813333-39.296 39.296l-53.642667-14.634667-6.229333 3.669333A254.933333 254.933333 0 0 1 682.666667 906.666667c-77.994667 0-147.84-34.88-194.805334-89.888a352.608 352.608 0 0 1-56.64 4.554666c-63.338667 0-124.266667-16.853333-177.472-48.298666-1.834667-1.088-6.410667-3.733333-13.632-7.893334l-80.544 21.653334c-23.914667 6.432-45.76-15.573333-39.146666-39.434667l21.792-78.752a961.205333 961.205333 0 0 1-15.904-27.317333A336.384 336.384 0 0 1 85.333333 480c0-188.618667 154.965333-341.333333 345.888-341.333333 159.914667 0 297.984 108.010667 335.818667 259.296 0.949333 3.765333 1.173333 7.552 0.778667 11.2z m-68.106667-13.952C662.88 282.037333 555.178667 202.666667 431.221333 202.666667 275.434667 202.666667 149.333333 326.933333 149.333333 480c0 46.272 11.498667 90.837333 33.194667 130.698667 2.88 5.290667 10.176 17.706667 21.621333 36.746666a32 32 0 0 1 3.413334 25.013334l-10.517334 37.994666 39.232-10.549333a32 32 0 0 1 24.234667 3.146667c14.272 8.192 22.773333 13.098667 25.802667 14.890666A283.882667 283.882667 0 0 0 431.221333 757.333333c6.154667 0 12.288-0.192 18.389334-0.576A255.061333 255.061333 0 0 1 426.666667 650.666667c0-141.386667 114.613333-256 256-256 5.728 0 11.413333 0.192 17.045333 0.554666z m133.706667 397.056a32 32 0 0 1 3.338666-24.725333 996.672 996.672 0 0 0 15.242667-26.293333A190.997333 190.997333 0 0 0 874.666667 650.666667c0-106.037333-85.962667-192-192-192s-192 85.962667-192 192 85.962667 192 192 192a190.933333 190.933333 0 0 0 98.570666-27.2c2.208-1.322667 8.288-4.874667 18.517334-10.837334a32 32 0 0 1 24.522666-3.210666l12.565334 3.424-3.424-12.565334zM330.666667 426.666667a42.666667 42.666667 0 1 1 0-85.333334 42.666667 42.666667 0 0 1 0 85.333334z m192 0a42.666667 42.666667 0 1 1 0-85.333334 42.666667 42.666667 0 0 1 0 85.333334z m85.333333 202.666666a32 32 0 1 1 0-64 32 32 0 0 1 0 64z m149.333333 0a32 32 0 1 1 0-64 32 32 0 0 1 0 64z"
            fill="#000000" p-id="4192"></path>
        </svg>
      </div>
      <div class="content">
        <form @submit.prevent="login">
          <div class="form-item">
            <label>用户名:</label>
            <input v-model="username" type="text" required placeholder="请输入用户名">

          </div>
          <div class="form-item">
            <label>密码:</label>
            <input v-model="password" type="password" required placeholder="请输入密码">

          </div>
          <div class="button-group">
            <button class="register-btn">注册</button>
          </div>
        </form>

      </div>

    </div>
  </div>
  <!-- <RouterView /> -->
</template>
<script setup lang="ts">
import axios from 'axios'
import { ref } from 'vue'
const username = ref('')
const password = ref('')


const login = async () => {
  try {
    const response = await axios.post('http://localhost:8000/Login/register/', {
      username: username.value,
      password: password.value
    })
    console.log(response)

    alert(response.data)

  } catch (error: any) {
    console.log(error.response)
  }

}


</script>
<style scoped>
.container {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
  /* 使用视口高度,确保容器高度覆盖整个屏幕 */

  .box {
    width: 400px;
    height: 400px;
    border-radius: 10px;
    box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);

    .header {
      display: flex;
      justify-content: center;
      align-items: center;
      margin-top: 10px;

      h2 {
        margin-left: 10px;

      }
    }

    .form-item {
      /* display: flex; */
      flex-direction: column;

      margin: 20px 0;

      label {
        display: block;
        margin-bottom: 8px;
        color: #666;
        margin-left: 50px;
      }

      input {
        width: 300px;
        height: 30px;
        border: 1px solid #ccc;
        border-radius: 5px;
        margin-left: 50px;

      }
    }

    .content {
      .form-item1 {
        display: flex;
        align-items: center;


        label {

          margin-bottom: 8px;
          color: #666;
          margin-left: 30px;
        }

        input {

          width: 300px;
          height: 30px;
          border: 1px solid #ccc;
          border-radius: 5px;
        }


      }

      .button-group {
        display: flex;
        justify-content: center;
        margin-top: 30px;


        .register-btn {
          background-color: #67C23A;
          color: white;
          width: 200px;
          height: 40px;
          border-radius: 4px;
          border: none;
          /* 去掉边框 */
          cursor: pointer;
          /* 鼠标移上去显示手型 */
          font-size: 16px;
          transition: background-color 0.3s;
          /*平滑过渡:当元素的背景颜色发生变化时,不会立即切换,而是会在0.3秒内逐渐过渡到新的颜色。*/
        }

        .register-btn:hover {
          background-color: #85ce61;
        }
      }
    }
  }
}
</style>

样式:
 

在 Vue 3 中,const login = async () => { ... } 是一种常用的定义异步函数的方法,但它并不是 Vue 3 特有的写法,而是 JavaScript 的语法。这种写法在 Vue 3 的代码中非常常见,尤其是在处理异步逻辑(如 API 请求)时。

这时候试着输入内容,点击注册,即可看到弹框内容:注册成功。

查看数据库看到,内容成功存入数据库:

总结 

顺利走到这就实现了一个简单的前后端联调注册功能^-^

本文章已经生成可运行项目
<think>我们有一个前后端分离项目,后端使用Django前端使用Vue。用户希望知道如何在PyCharm中运行这样的项目。 步骤通常包括: 1. 确保后端Django项目可以在PyCharm中运行。 2. 确保前端Vue项目可以运行(通常使用命令行,但PyCharm也可以配置运行前端项目)。 3. 处理跨域问题(因为前端后端运行在不同端口)。 根据引用,我们需要注意: - 引用[2]提到跨域问题,并指出使用django-cors-headers可能遇到的问题,但我们还是尝试使用它。 - 引用[3]提到Vue项目打包和配置,但在开发阶段我们通常使用Vue的开发服务器(npm run serve)而不是打包。 - 引用[4]给出了Django主路由的配置示例。 具体步骤: 后端Django)部分: 1.PyCharm中打开Django项目。 2. 确保已安装所需依赖,包括django-cors-headers(用于跨域)。 3. 配置Django项目的settings.py: - 添加corsheaders到INSTALLED_APPS。 - 添加corsheaders.middleware.CorsMiddleware到MIDDLEWARE(尽量放在前面)。 - 设置CORS_ORIGIN_ALLOW_ALL = True(开发阶段允许所有源,生产环境需关闭)或者指定前端地址(如:CORS_ORIGIN_WHITELIST = [&#39;http://localhost:8080&#39;])。 - 注意:如果遇到csrf问题,可能需要注释掉&#39;django.middleware.csrf.CsrfViewMiddleware&#39;(或者单独处理CSRF,但开发阶段可以先禁用)。 4. 配置路由(如引用[4]所示)。 5.PyCharm配置Django运行配置:选择Django服务器,指定端口(默认8000),然后运行。 前端Vue)部分: 1.PyCharm中打开Vue项目(可以单独打开,或者将Vue项目放在Django项目目录下,但通常分开)。 2. 确保已安装Node.js和npm(或yarn)。 3.PyCharm的终端中进入Vue项目目录,运行`npm install`安装依赖。 4. 配置Vue项目的开发服务器代理(可选,避免跨域): 在vue.config.js(如果没有则创建)中配置代理: ```js module.exports = { devServer: { proxy: { &#39;/api&#39;: { target: &#39;http://localhost:8000&#39;, // Django后端地址 changeOrigin: true, pathRewrite: { &#39;^/api&#39;: &#39;&#39; // 如果后端接口没有前缀,可以去掉/api;如果有,则根据实际情况重写 } } } } } ``` 这样,前端请求/api开头的请求会被代理到后端。 5.PyCharm配置运行Vue项目: 可以通过两种方式: a. 使用PyCharm内置的npm运行配置:创建一个npm配置,命令为`run serve`(或`serve`,具体看package.json中的scripts)。 b. 直接在终端中运行`npm run serve`(Vue项目默认运行在8080端口)。 运行: 1. 先运行Django后端(在PyCharm中点击运行Django项目)。 2. 再运行Vue前端(在PyCharm中运行npm配置或者终端命令)。 3. 访问前端提供的地址(如http://localhost:8080)即可。 注意:如果前端没有配置代理,那么前端代码中请求后端API时需要使用完整的后端地址(如http://localhost:8000/api/some/endpoint/),并且需要处理跨域(这就是为什么我们在后端配置了corsheaders)。 另外,引用[3]提到的打包部署方式(npm run build)是生产环境部署,开发阶段不需要。 根据引用[1],我们可以编写一个简单的视图来测试前后端连接。 示例视图(views.py): ```python from django.http import JsonResponse def test_connection(request): return JsonResponse({&#39;message&#39;: &#39;测试成功&#39;}) ``` 然后配置URL(在user/urls.py): ```python from django.urls import path from . import views urlpatterns = [ path(&#39;test/&#39;, views.test_connection, name=&#39;test_connection&#39;), ] ``` 在前端,可以使用axios(或fetch)请求这个接口: ```javascript axios.get(&#39;/api/test/&#39;) // 如果配置了代理,则请求会被转发到http://localhost:8000/test/ .then(response => { console.log(response.data); }) ``` 如果遇到跨域问题,检查后端corsheaders配置是否正确,并确保后端在运行。 总结步骤: 1. 配置后端Django)的跨域设置。 2. 运行后端3. 配置前端Vue)的代理(可选,但推荐)。 4. 运行前端。 5. 访问前端地址进行测试。 注意:在PyCharm中运行两个项目,需要分别打开两个项目窗口?或者使用PyCharm的多项目支持(Professional本支持多个项目在一个窗口)。如果只有一个窗口,可以将前后端项目放在同一个根目录下,然后作为两个app在PyCharm中管理。或者,分别用两个PyCharm窗口打开。 对于PyCharm专业,可以打开Django项目,然后通过“Attach”的方式将Vue项目也加入同一个窗口。然后分别配置两个运行配置:一个Django server,一个npm(运行Vue的serve)。 对于社区,可能需要两个窗口,或者在一个窗口中运行后端,另一个窗口运行前端(通过终端命令)。 下面,我们按照步骤详细说明。</think>在 PyCharm 中运行基于 DjangoVue前后端分离项目,需分别配置后端前端环境,并解决跨域问题。以下是详细步骤: --- ### **1. 后端 Django 配置** #### (1) 创建 PyCharm 项目 - 打开 PyCharm → `New Project` → 选择 `Django` 模板 - 配置 Python 解释器(建议使用虚拟环境) #### (2) 安装依赖 在终端执行: ```bash pip install django django-rest-framework django-cors-headers ``` #### (3) 配置跨域支持(关键) 修改 `settings.py`: ```python INSTALLED_APPS = [ ... &#39;corsheaders&#39;, # 添加 &#39;rest_framework&#39;, ] MIDDLEWARE = [ &#39;corsheaders.middleware.CorsMiddleware&#39;, # 放在最顶部 ... ] # 允许所有域名跨域(开发阶段) CORS_ORIGIN_ALLOW_ALL = True # 或指定前端域名(生产环境) # CORS_ORIGIN_WHITELIST = [&#39;http://localhost:8080&#39;] ``` #### (4) 创建测试视图 在 `views.py` 添加: ```python from django.http import JsonResponse def test_api(request): return JsonResponse({"message": "Django-Vue 连接成功!"}) ``` #### (5) 配置路由 `urls.py` ```python from django.urls import path from . import views urlpatterns = [ path(&#39;api/test/&#39;, views.test_api), ] ``` #### (6) 运行后端 - 在 PyCharm 顶部工具栏:选择 Django Server 配置 → 点击运行(默认端口 8000) - 访问 `http://localhost:8000/api/test/` 验证 JSON 输出 --- ### **2. 前端 Vue 配置** #### (1)PyCharm 中打开 Vue 项目 - 单独打开 Vue 项目文件夹( Django 项目同目录) - 或通过 PyCharm 的 `Attach Project` 将 Vue 加入当前窗口 #### (2) 配置开发服务器代理 在 `vue.config.js` 中添加代理(解决跨域): ```javascript module.exports = { devServer: { proxy: { &#39;/api&#39;: { target: &#39;http://localhost:8000&#39;, // 指向 Django 后端 changeOrigin: true, pathRewrite: {&#39;^/api&#39;: &#39;&#39;} } } } } ``` #### (3) 测试 API 调用 在 Vue 组件中使用 Axios: ```javascript axios.get(&#39;/api/test/&#39;) .then(response => { console.log(response.data); // 应输出 "Django-Vue 连接成功!" }); ``` #### (4) 运行前端 - 在 PyCharm 终端执行: ```bash npm install npm run serve ``` - 访问 `http://localhost:8080` 查看前端页面 --- ### **3. 联调验证** 1. 同时运行 Django 后端Vue 前端 2.前端页面调用 `/api/test/` 接口,检查控制台是否返回成功消息 3. 若遇跨域错误(CORS),检查: - `django-cors-headers` 中间件是否启用 - `CORS_ORIGIN_ALLOW_ALL` 是否设为 `True` - 浏览器缓存问题(尝试无痕模式) --- ### **关键问题解决** - **跨域故障**:确保 `django-cors-headers` 配置正确,且中间件顺序靠前[^2]。 - **路由冲突**:Django 主路由需包含 API 子路由(如 `path(&#39;&#39;, include(&#39;app.urls&#39;))`)[^4]。 - **生产部署**:将 Vue 打包文件(`dist/`)复制到 Django 的静态文件夹,并配置 `STATICFILES_DIRS`[^3]。 --- ### 相关问题 1. 如何解决 Django-Vue 项目中的 CSRF 令牌验证问题? 2. Vue 项目打包后如何集成到 Django 生产环境? 3. 除了 `django-cors-headers`,还有哪些跨域解决方案? [^1]: 测试视图函数示例 [^2]: `django-cors-headers` 配置注意事项 [^3]: Vue 打包及静态文件配置 [^4]: Django 主路由分发配置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值