• 从零开始搭建Django+vue前后端分离项目


    此博客仅是记录学习的过程!!!

    今天也是又又又一次开始减肥的第一天!!!

    减肥要加油~学习也要加油~

    备注:附上完整的项目结构+页面展示

    一、环境准备

     
    • python3.x版本 python3 --version

    django3版本 python3 -m django --version 

    • node "brew install node"/node官网下载
    • mysql

    二、新建django项目

    方法1:
    1.创建项目:django-admin startproject book_project
    2.再新建app:
    进入项目根目录:
    cd book_project
    python3 manage.py startapp book
     
    方法2: pycharm---推荐
     
    项目目录结构

    三、后端准备

    3.1、更改settings配置

    3.1.1、更改数据库配置

    在book_project下的settings.py配置文件中,把默认的sqllite3数据库换成我们的mysql数据库

    3.1.2、导入pymysql包

    在项目setting文件同级__init__.py文件下加入
    1 import pymysql
    2 pymysql.version_info=(1,3,13,"final",0)
    3 pymysql.install_as_MySQLdb()

    3.1.3、更改installed_apps

    将创建的app加入到installed_apps里面

    3.2、创建model

     1 from __future__ import unicode_literals
     2 from django.db import models
     3 
     4 # Create your models here.
     5 
     6 class Book(models.Model):
     7     book_name = models.CharField(max_length=64)
     8     add_time = models.DateTimeField(auto_now_add=True)
     9 
    10     def __unicode__(self):
    11         return self.book_name

    3.3、新增接口

    在app目录下的views里我们新增两个接口,一个是show_books返回所有的书籍列表(通过JsonResponse返回能被前端识别的json格式数据),二是add_book接受一个get请求,往数据库里添加一条book数据
     1 from django.shortcuts import render
     2 
     3 # Create your views here.
     4 from book.models import Book
     5 from django.views.decorators.http import require_http_methods
     6 from django.http import JsonResponse
     7 from django.core import serializers
     8 import json
     9 
    10 # Create your views here.
    11 @require_http_methods(["GET"])
    12 def add_book(request):
    13     response = {}
    14     try:
    15         book = Book(book_name=request.GET.get('book_name'))
    16         book.save()
    17         response['msg'] = 'success'
    18         response['error_num'] = 0
    19     except Exception as e:
    20         response['msg'] = str(e)
    21         response['error_num'] = 1
    22 
    23     return JsonResponse(response)
    24 
    25 @require_http_methods(["GET"])
    26 def show_books(request):
    27     response = {}
    28     try:
    29         books = Book.objects.filter()
    30         response['list'] = json.loads(serializers.serialize("json", books))
    31         response['msg'] = 'success'
    32         response['error_num'] = 0
    33     except Exception as e:
    34         response['msg'] = str(e)
    35         response['error_num'] = 1
    36 
    37     return JsonResponse(response)

    3.4、创建app路由

    3.4.1、 将新接口加入到app的路由下

    在app目录下,新增一个urls.py文件,把我们新增的两个接口添加到路由里
    1 from django.urls import path, re_path
    2 from book import views
    3 
    4 urlpatterns = [
    5     re_path('add_book$', views.add_book),
    6     re_path('show_books/', views.show_books),
    7 ]

    3.4.2、将app的路由,导入到项目路由

    把app下的urls添加到项目book_project下的urls中,才能完成路由
    1 from django.urls import include, re_path
    2 from django.contrib import admin
    3 from book import urls
    4 
    5 urlpatterns = [
    6     re_path('admin/', admin.site.urls),
    7     re_path('api/', include(urls)),
    8 ]

    3.5、初始化数据库

    进入项目根目录,输入
    先 python3 manage.py makemigrations
    再 python3 manage.py migrate
    显示如下图就是成功了

    验证此时数据库book_book表已经加入

    四、启动服务测试接口

    4.1、启动服务

    进入项目根目录,输入:
    python3 manage.py runserver
     

    4.2、验证接口

    postman调用:
    插入书籍接口:http://127.0.0.1:8000/api/add_book?book_name=张雪test1

    至此后端接口准备完毕,下面开始前端

    前端用的是vue-admin-templatevue-element-admin的基础模版

    使用规则见:https://panjiachen.github.io/vue-element-admin-site/zh/guide/#%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84

    五、前端准备

    5.1、下载模版

     

     1 # 克隆项目
     2 git clone https://github.com/PanJiaChen/vue-admin-template.git
     3 # 也可以多下载个完整的模版,用到组件时,copy过来
     4 # git clone https://github.com/PanJiaChen/vue-element-admin.git
     5 
     6 # 进入项目目录
     7 cd vue-admin-template
     8 
     9 # 安装依赖, 建议不要用 cnpm 安装 会有各种诡异的bug 可以通过如下操作解决 npm 下载速度慢的问题
    10 npm install --registry=https://registry.npm.taobao.org
    11 
    12 # 本地开发 启动项目
    13 npm run dev
    14 # ps:启动的时候报错了,提示提示vue-cli-service: command not found
    15 # 进入到项目目录下,执行:rm –rf node_modules and npm install

    5.2、项目目录结构,启动效果

    5.3、与服务端交互,添加api

    在src->api->创建book.js文件

     1 import request from '@/utils/request'
     2 
     3 export function getList() {
     4   return request({
     5     url: '/api/show_books',
     6     method: 'get',
     7   })
     8 }
     9 
    10 export function addbook(book_name) {
    11   return request({
    12     url: '/api/add_book',
    13     method: 'get',
    14     params: { book_name }
    15   })
    16 }

    5.4、加侧边栏-book

    5.4.1、添加views的vue文件

    在src->views->创建book文件夹->index.vue
     1 <template>
     2   <div class="app-container">
     3     <el-row display="margin-top:10px">
     4       <el-input v-model="input_bookname" placeholder="请输入书名" style="display:inline-table;  30%; float:left"></el-input>
     5       <el-button type="primary" @click="addBook()" style="float:left; margin: 2px;">新增</el-button>
     6     </el-row>
     7     <el-row>
     8       <el-table :data="list_book" element-loading-text="Loading" border fit highlight-current-row>
     9         <el-table-column align="center" label="ID" width="95">
    10           <template slot-scope="scope">
    11             {{ scope.row.pk }}
    12           </template>
    13         </el-table-column>
    14         <el-table-column label="Book_name">
    15           <template slot-scope="scope">
    16             {{ scope.row.fields.book_name }}
    17           </template>
    18         </el-table-column>
    19         <el-table-column label="Time" align="center">
    20           <template slot-scope="scope">
    21             <span>{{ scope.row.fields.add_time }}</span>
    22           </template>
    23         </el-table-column>
    24       </el-table>
    25     </el-row>
    26   </div>
    27 </template>
    28 
    29 <script>
    30   import {
    31     getList,
    32     addbook
    33   } from '@/api/book'
    34 
    35   export default {
    36     filters: {
    37       statusFilter(status) {
    38         const statusMap = {
    39           published: 'success',
    40           draft: 'gray',
    41           deleted: 'danger'
    42         }
    43         return statusMap[status]
    44       }
    45     },
    46     data() {
    47       return {
    48         list_book: null,
    49         listLoading: true,
    50         input_bookname: ''
    51       }
    52     },
    53     created() {
    54       this.getList()
    55     },
    56     methods: {
    57       getList() {
    58         this.listLoading = true
    59         getList().then(response => {
    60           if (response.error_num === 0) {
    61             this.list_book = response['list']
    62             this.listLoading = false
    63           } else {
    64             this.$message.error('查询书籍失败')
    65             console.log(response['msg'])
    66           }
    67         })
    68       },
    69       addBook() {
    70         addbook(this.input_bookname).then(response => {
    71           if (response.error_num === 0) {
    72             this.getList()
    73             this.input_bookname = ''
    74           } else {
    75             this.$message.error('新增书籍失败,请重试')
    76             console.log(response['msg'])
    77           }
    78         })
    79       }
    80     }
    81   }
    82 </script>

    5.4.2、给菜单加路由,就完成了新增一个侧边栏

    修改src->router->index.js文件
     1 {
     2     path: '/book_test',
     3     component: Layout,
     4     children: [
     5       {
     6         path: 'book',
     7         name: 'Book',
     8         component: () => import('@/views/book/index'),
     9         meta: { title: 'Book', icon: 'form' }
    10       }
    11     ]
    12   },

    5.5、启动前端项目

    启动命令:npm run dev
    启动后会出现异常,异常情况很多。404/500/403等等情况
    先解决跨域
     

    六、解决跨域

    6.1、后端django修改

    sudo pip3 install django-cors-headers
    在book_project->settings文件夹下,修改如下内容,注意顺序
     1 MIDDLEWARE = [
     2     'django.middleware.security.SecurityMiddleware',
     3     'django.contrib.sessions.middleware.SessionMiddleware',
     4     'corsheaders.middleware.CorsMiddleware',
     5     'django.middleware.common.CommonMiddleware',
     6     'django.middleware.csrf.CsrfViewMiddleware',
     7     'django.contrib.auth.middleware.AuthenticationMiddleware',
     8     'django.contrib.messages.middleware.MessageMiddleware',
     9     'django.middleware.clickjacking.XFrameOptionsMiddleware',
    10 ]
    11 
    12 CORS_ORIGIN_ALLOW_ALL = True

    6.2、前端添加跨域相关

    添加proxy。ps不同版本可能位置不一样。我下载的这个模版是下面的路径
    主目录的vue.config.js文件
    1 proxy: {
    2       '/api': {
    3           target: 'http://127.0.0.1:8000',
    4           changeOrigin: true,
    5       }

    七、启动项目

    7.1、启动后端项目

    python3 manage.py runserver

    7.2、启动前端项目

    npm run dev

    7.3、查看效果

    八、整合项目

    目前我们已经分别完成了Django后端和Vue.js前端工程的创建和编写,但实际上它们是运行在各自的服务器上,和我们的要求是不一致的。因此我们须要把Django的TemplateView指向我们刚才生成的前端dist文件
     

    8.1、前端写完后,进行打包,生成dist文件

    npm run build:prod        ## 打包vue项目,会将所有东西打包成一个dist文件夹 

    8.2、配置django

    8.2.1、创建appfront文件夹,将vue打包的dist复制过来

    8.2.2、修改入口urls文件

    re_path(r'^$', TemplateView.as_view(template_name='index.html')),

    8.2.3、修改settings文件,让代码能找到index.html

    TEMPLATES更改DIRS,配置下模版
     1 TEMPLATES = [
     2     {
     3         'BACKEND': 'django.template.backends.django.DjangoTemplates',
     4         'DIRS': ['appfront/dist'],
     5         'APP_DIRS': True,
     6         'OPTIONS': {
     7             'context_processors': [
     8                 'django.template.context_processors.debug',
     9                 'django.template.context_processors.request',
    10                 'django.contrib.auth.context_processors.auth',
    11                 'django.contrib.messages.context_processors.messages',
    12             ],
    13         },
    14     },
    15 ]

    8.2.4、修改settings文件,配置一下静态文件的搜索路径

    1 STATICFILES_DIRS = [
    2     os.path.join(BASE_DIR, 'appfront/dist/static')
    3 ]

    九、再次启动项目

    此次不用专门启动前端了 ,直接python3 manage.py runserver。然后访问http://127.0.0.1:8000/就到了入口页面
     
     
     
    Ending........后面开始完善功能啦,完善成功后就要开始部署之旅了~~~
     
    继续减肥~~继续学习!!!

     

  • 相关阅读:
    如何设置body高度为浏览器高度
    h5的video下载按钮如何隐藏
    微信小程序中的子父组件传值问题
    elementUI级联选择器2(选择及回显)编辑保存
    elementUI级联选择器(选择及回显)
    vue+elementUI 表格操作行的增删改查
    单独验证非form表单中的input(限制)
    JS中去除数组中的假值(0, 空,undefined, null, false)
    vue 组件之间的传值 (父子传值、兄弟传值)
    http协议的状态码
  • 原文地址:https://www.cnblogs.com/zhangxue521/p/12957816.html
Copyright © 2020-2023  润新知