從零開始搭建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

 

查詢書籍接口: http://127.0.0.1:8000/api/show_books

 

 

 

至此后端接口准備完畢,下面開始前端

前端用的是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; width: 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等等情況
先解決跨域
 

5.6、修改前端對response中code碼校驗

因為下載的前端模版,有對后端返回的response中code碼的校驗,並且規定的code碼是:20000

所以處理的時候有兩種方法

1、后端接口返回code:20000

2、后端如果不用code:20000、前端代碼中將此校驗去掉。

我使用的是第二種方法

找到src-->utils-->request.js文件中,找到respons一段代碼,改為下面內容,將校驗注釋掉

只留下,return res

或者將20000的code碼改成你后端約定的碼

 

 

 

 
 

六、解決跨域

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、查看效果

 

 

 

八、整合項目【前后端分別部署的跳過89步驟,到此就結束了】

目前我們已經分別完成了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........后面開始完善功能啦,完善成功后就要開始部署之旅了~~~
 
繼續減肥~~繼續學習!!!

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2024 CODEPRJ.COM