一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

后端Django + 前端Vue.js快速搭建web項(xiàng)目

 只怕想不到 2021-09-26

參考網(wǎng)上一篇文章做了點(diǎn)細(xì)節(jié)補(bǔ)充。

本篇使用Vue.js作為前端框架,代替Django本身較為孱弱的模板引擎,Django則作為服務(wù)端提供api接口,使得前后端實(shí)現(xiàn)完全分離,更適合單頁(yè)應(yīng)用的開發(fā)構(gòu)建。

一、 環(huán)境準(zhǔn)備

安裝環(huán)境:

Django系:

Python 3.6 +

Django 1.11.13

Mysql 5.7

Python的MySQL相關(guān)模塊等

推薦python相關(guān)的模塊(包括Django)都使用python自帶的pip安裝器安裝。命令:pip install django即可安裝最新版本的django,或者pip install django==1.11.13安裝指定版本

Vue.js系:

Node.js 8.11.2

有關(guān)Vue的模塊(包括vue)可以使用node自帶的npm包管理器安裝。推薦使用淘寶的 cnpm  命令行工具代替默認(rèn)的 npm

npm install -g cnpm --registry=https://registry.npm.taobao.org

二、 構(gòu)建Django項(xiàng)目

我們首先使用Django來(lái)搭建web后端api框架。

1、 先在終端敲入命令:

django-admin startproject myproject

目錄結(jié)構(gòu):

2、 進(jìn)入項(xiàng)目根目錄,創(chuàng)建一個(gè)app:

python manage.py startapp myapp

目錄結(jié)構(gòu):

3、 在myproject下的settings.py配置文件中,把默認(rèn)的sqllite3數(shù)據(jù)庫(kù)換成我們的mysql數(shù)據(jù)庫(kù):

  1. # Database
  2. # https://docs.djangoproject.com/en/1.11/ref/settings/#databases
  3. DATABASES = {
  4. 'default': {
  5. 'ENGINE': 'django.db.backends.mysql',
  6. 'NAME': 'testcon',
  7. 'USER': 'root',
  8. 'PASSWORD': '123456',
  9. 'HOST': '127.0.0.1',
  10. }
  11. }

并把a(bǔ)pp加入到installed_apps列表里:

  1. INSTALLED_APPS = [
  2. 'django.contrib.admin',
  3. 'django.contrib.auth',
  4. 'django.contrib.contenttypes',
  5. 'django.contrib.sessions',
  6. 'django.contrib.messages',
  7. 'django.contrib.staticfiles',
  8. 'myapp',
  9. ]

4、 在app目錄下的models.py里我們簡(jiǎn)單寫一個(gè)model如下:

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

只有兩個(gè)字段,書名book_name和添加時(shí)間add_time。如果沒(méi)有指定主鍵的話django會(huì)自動(dòng)新增一個(gè)自增id作為主鍵

5、 在app目錄下的views里我們新增兩個(gè)接口,一個(gè)是show_books返回所有的書籍列表(通過(guò)JsonResponse返回能被前端識(shí)別的json格式數(shù)據(jù)),二是add_book接受一個(gè)get請(qǐng)求,往數(shù)據(jù)庫(kù)里添加一條book數(shù)據(jù):

  1. from django.shortcuts import render
  2. from django.views.decorators.http import require_http_methods
  3. from django.core import serializers
  4. from django.http import JsonResponse
  5. import json
  6. from .models import Book
  7. # Create your views here.
  8. @require_http_methods(["GET"])
  9. def add_book(request):
  10. response = {}
  11. try:
  12. book = Book(book_name=request.GET.get('book_name'))
  13. book.save()
  14. response['msg'] = 'success'
  15. response['error_num'] = 0
  16. except Exception as e:
  17. response['msg'] = str(e)
  18. response['error_num'] = 1
  19. return JsonResponse(response)
  20. @require_http_methods(["GET"])
  21. def show_books(request):
  22. response = {}
  23. try:
  24. books = Book.objects.filter()
  25. response['list'] = json.loads(serializers.serialize("json", books))
  26. response['msg'] = 'success'
  27. response['error_num'] = 0
  28. except Exception as e:
  29. response['msg'] = str(e)
  30. response['error_num'] = 1
  31. return JsonResponse(response)

可以看出,在ORM的幫忙下,我們的接口實(shí)際上不需要自己去組織SQL代碼

6、 在app目錄下,新增一個(gè)urls.py文件,把我們新增的兩個(gè)接口添加到路由里:

from django.conf.urls import url, includeimport views

urlpatterns = [url(r'add_book$', views.add_book, ),url(r'show_books$', views.show_books, ),]

  1. 我們還要把a(bǔ)pp下的urls添加到project下的urls中,才能完成路由:
  1. from django.conf.urls import url, include
  2. from django.contrib import admin
  3. from django.views.generic import TemplateView
  4. import myapp.urls
  5. urlpatterns = [
  6. url(r'^admin/', admin.site.urls),
  7. url(r'^api/', include(myapp.urls)),
  8. url(r'^$', TemplateView.as_view(template_name="index.html")),
  9. ]
  1. 在項(xiàng)目的根目錄,輸入命令:

python manage.py makemigrations myapp

python manage.py migrate

查詢數(shù)據(jù)庫(kù),看到book表已經(jīng)自動(dòng)創(chuàng)建了:

  1. 在項(xiàng)目的根目錄,輸入命令:

python manage.py runserver

啟動(dòng)服務(wù),通過(guò)postman測(cè)試一下我們剛才寫的兩個(gè)接口:

add_book

show_books

三、 構(gòu)建Vue.js前端項(xiàng)目

1、 先用npm安裝vue-cli腳手架工具(vue-cli是官方腳手架工具,能迅速幫你搭建起vue項(xiàng)目的框架):

    `npm install -g vue-cli`

安裝好后,在project項(xiàng)目根目錄下,新建一個(gè)前端工程目錄:

    vue-init webpack appfront  //安裝中把vue-router選上,我們須要它來(lái)做前端路由

進(jìn)入appfront目錄,運(yùn)行命令:

    npm install //安裝vue所須要的node依賴
 npm install  vue-resource 
 npm install element-ui

現(xiàn)在我們可以看到整個(gè)文件目錄結(jié)構(gòu)是這樣的:

2、 在目錄src下包含入口文件main.js,入口組件App.vue等。后綴為vue的文件是Vue.js框架定義的單文件組件,其中標(biāo)簽中的內(nèi)容可以理解為是類html的頁(yè)面結(jié)構(gòu)內(nèi)容,標(biāo)簽中的是js的方法、數(shù)據(jù)方面的內(nèi)容,而則是css樣式方面的內(nèi)容:

3、 我們?cè)趕rc/component文件夾下新建一個(gè)名為Home.vue的組件,通過(guò)調(diào)用之前在Django上寫好的api,實(shí)現(xiàn)添加書籍和展示書籍信息的功能。在樣式組件上我們使用了餓了么團(tuán)隊(duì)推出的element-ui,這是一套專門匹配Vue.js框架的功能樣式組件。由于組件的 編碼涉及到了很多js、html、css的知識(shí),并不是本文的重點(diǎn),因此在此只貼出部分代碼:

4、 在src/router目錄的index.js中,我們把新建的Home組件,配置到vue-router路由中:

5、 如果發(fā)現(xiàn)列表抓取不到數(shù)據(jù),可能是出現(xiàn)了跨域問(wèn)題,打開瀏覽器console確認(rèn):

這時(shí)候我們須要在Django層注入header,用Django的第三方包django-cors-headers來(lái)解決跨域問(wèn)題:

       pip install django-cors-headers

settings.py 修改:

  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. CORS_ORIGIN_ALLOW_ALL = True
  注意中間件的添加順序

6、 在前端工程目錄下,輸入npm run dev啟動(dòng)node自帶的服務(wù)器,瀏覽器會(huì)自動(dòng)打開, 我們能看到頁(yè)面:

嘗試新增書籍,新增的書籍信息會(huì)實(shí)時(shí)反映到頁(yè)面的列表中,這得益于Vue.js的數(shù)據(jù)雙向綁定特性。

  1. 在前端工程目錄下,輸入npm run build,如果項(xiàng)目沒(méi)有錯(cuò)誤的話,就能夠看到所有的組件、css、圖片等都被webpack自動(dòng)打包到dist目錄下了:

五、 整合Django和Vue.js

目前我們已經(jīng)分別完成了Django后端和Vue.js前端工程的創(chuàng)建和編寫,但實(shí)際上它們是運(yùn)行在各自的服務(wù)器上,和我們的要求是不一致的。因此我們須要把Django的TemplateView指向我們剛才生成的前端dist文件即可。

1、 找到project目錄的urls.py,使用通用視圖創(chuàng)建最簡(jiǎn)單的模板控制器,訪問(wèn) 『/』時(shí)直接返回 index.html:

  1. urlpatterns = [
  2. url(r'^admin/', admin.site.urls),
  3. url(r'^api/', include(myapp.urls)),
  4. url(r'^$', TemplateView.as_view(template_name="index.html")),
  5. ]

2、 上一步使用了Django的模板系統(tǒng),所以需要配置一下模板使Django知道從哪里找到index.html。在project目錄的settings.py下:

  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. ]

3、 我們還需要配置一下靜態(tài)文件的搜索路徑。同樣是project目錄的settings.py下:

  1. # Add for vuejs
  2. STATICFILES_DIRS = [
  3. os.path.join(BASE_DIR, "appfront/dist/static"),
  4. ]

4、 配置完成,我們?cè)趐roject目錄下輸入命令python manage.py runserver,就能夠看到我們的前端頁(yè)面在瀏覽器上展現(xiàn):

注意服務(wù)的端口已經(jīng)是Django服務(wù)的8000而不是node服務(wù)的8080了

項(xiàng)目源碼:

https://github.com/HubDou/vue-django.git


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    中国一区二区三区不卡| 国产精品推荐在线一区| 亚洲伦理中文字幕在线观看| 亚洲午夜av一区二区| 婷婷亚洲综合五月天麻豆| 亚洲日本中文字幕视频在线观看| 欧美精品一区久久精品| 国产99久久精品果冻传媒| 97人摸人人澡人人人超碰| 免费啪视频免费欧美亚洲| 午夜视频免费观看成人| 成人精品一区二区三区在线| 成年人黄片大全在线观看| 亚洲熟女熟妇乱色一区| 久久热麻豆国产精品视频| 婷婷色国产精品视频一区| 欧美日韩精品视频在线| 欧美尤物在线视频91| 五月激情婷婷丁香六月网| 国产精品成人又粗又长又爽| 亚洲日本中文字幕视频在线观看 | 最近中文字幕高清中文字幕无| 男女午夜视频在线观看免费| 黄色激情视频中文字幕| 午夜午夜精品一区二区| 亚洲综合激情另类专区老铁性| 日韩视频在线观看成人| 国产在线日韩精品欧美| 国产免费无遮挡精品视频| 东京热男人的天堂久久综合| 日韩毛片视频免费观看| 日本免费一级黄色录像| 国产高清一区二区白浆| 五月婷婷缴情七月丁香| 国产成人精品在线播放| 激情丁香激情五月婷婷| 国产精品一级香蕉一区| 亚洲婷婷开心色四房播播| 亚洲午夜av一区二区| 亚洲男人的天堂久久a| 国产精品视频久久一区|