Django Vue构建前后端分离web项目框架

本文推荐给在工作中需要构建基于web项目的工程师们。例如测试平台、运维平台等,都可参考本文介绍的后端Django + 前端Vue.js的技术栈快速地搭建起一套web项目的框架。

1. 优点

Django是Python体系下最成熟的web框架之一,Django框架因其能够快速开发网站应用的特性成为了中小型网站开发框架首选。且Django具备的数据分析(Pandas)、任务队列(Celery)、DRF、ORM等一众功能都使得用户在面对任何建站需求时都能够得心应手。

Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的。Vue.js支持双向绑定、mustache标签语法等特性,并提供了更加简洁、更易于理解的API,使得我们能够快速地上手并使用Vue.js。

本篇使用Vue.js作为前端框架,代替Django本身较为薄弱的模板引擎,Django则作为服务端提供api接口,使得前后端实现完全分离,更适合单页应用的开发构建。

2. 前期准备

Django系:

Python 3.6

Django 2

Mysql 5.7

Python的MySQLdb模块等

Vue.js系:

Node.js 6.1

有关Vue的模块(包括vue)我们都使用node自带的npm包管理器安装

3. 构建Django项目

1、创建project:

django-admin startproject firstproject

2、创建app

进入项目根目录,创建一个app:

cd firstproject
python manage.py startapp firstapp

3、修改配置文件

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

# Database
# https://docs.djangoproject.com/en/2.0/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'firstproject',
        'USER': 'root',
        'PASSWORD': 'root',
        'HOST': '127.0.0.1',
    }
}

并把app加入到installed_apps列表里:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'firstapp',
]

4、创建model

在app目录下的models.py里我们简单写一个model如下:

# -*- coding: utf-8 -*-
from django.db import models

# Create your models here.
class Book(models.Model):
    book_name = models.CharField(max_length=64)
    add_time = models.DateTimeField(auto_now_add=True)

    def __unicode__(self):
        return self.book_name

只有两个字段,书名book_name和添加时间add_time。如果没有指定主键的话django会自动新增一个自增id作为主键

5、实现接口方法

在app目录下的views里我们新增两个接口,一个是show_books返回所有的书籍列表(通过JsonResponse返回能被前端识别的json格式数据),二是add_book接受一个get请求,往数据库里添加一条book数据:

from firstapp.models import Book
from django.views.decorators.http import require_http_methods
from django.http import JsonResponse
from django.core import serializers
import json

# Create your views here.
@require_http_methods(["GET"])
def add_book(request):
    response = {}
    try:
        book = Book(book_name=request.GET.get('book_name'))
        book.save()
        response['msg'] = 'success'
        response['error_num'] = 0
    except  Exception as e:
        response['msg'] = str(e)
        response['error_num'] = 1

    return JsonResponse(response)

@require_http_methods(["GET"])
def show_books(request):
    response = {}
    try:
        books = Book.objects.filter()
        response['list']  = json.loads(serializers.serialize("json", books))
        response['msg'] = 'success'
        response['error_num'] = 0
    except  Exception as e:
        response['msg'] = str(e)
        response['error_num'] = 1

    return JsonResponse(response)

可以看出,在ORM的帮忙下,我们的接口实际上不需要自己去组织SQL代码

6、创建app的路由

1. 在app目录下,新增一个urls.py文件,把我们新增的两个接口添加到路由里:

from django.conf.urls import path,re_path
from firstapp import views

urlpatterns = [
    re_path('add_book$', views.add_book),
    re_path('show_books/', views.show_books),
]

2. 我们还要把app下的urls添加到firstproject下的urls中,才能完成路由:

from django.urls import include, re_path
from django.contrib import admin
from firstapp import urls

urlpatterns = [
    re_path('admin/', admin.site.urls),
    re_path('api/', include(urls)),
]

3. 在项目的根目录,输入命令:

# python manage.py makemigrations firstapp
Migrations for 'firstapp':
  firstapp/migrations/0001_initial.py
    - Create model Book
# python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, firstapp, sessions
Running migrations:
  Applying firstapp.0001_initial... OK

4. 查询数据库,看到firstapp_book表已经自动创建了:

5. 在项目的根目录,输入命令启动服务:

python manage.py runserver

6. 通过curl测试一下我们刚才写的两个接口:

  • add_book

curl -X GET -H "Content-Type: application/json" http://127.0.0.1:8000/api/add_book?book_name=test
{"msg": "success", "error_num": 0}
  • show_books

curl -X GET -H "Content-Type: application/json" http://127.0.0.1:8000/api/show_books

四、构建Vue.js前端项目

1、安装脚手架

先用npm安装vue-cli脚手架工具(vue-cli是官方脚手架工具,能迅速帮你搭建起vue项目的框架):

npm install -g vue-cli

安装好后,在project项目根目录下,新建一个前端工程目录:

vue-init webpack appfront  //安装中把vue-router选上,我们需要它来做前端路由

2、安装依赖

进入appfront目录,运行命令:

npm install //安装vue所需要的node依赖

3、新增组件

我们在src/component文件夹下新建一个名为Library.vue的组件,通过调用之前在Django上写好的api,实现添加书籍和展示书籍信息的功能。在样式组件上我们使用了饿了么团队推出的element-ui,这是一套专门匹配Vue.js框架的功能样式组件:

4、element-ui安装使用

在命令行工具当中输入

  •  
cnpm i element-ui -S

在main.js中引入element相关的js和css

import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
Vue.use(ElementUI)

5、启动前端服务

在前端工程目录下,输入npm run dev启动node自带的服务器,浏览器会自动打开,或者在浏览器输入http:localhost:8080/#/,即可看到页面。

6、解决跨域

如果发现页面中列表抓取不到数据,可能是出现了跨域问题,打开浏览器console确认:

这时候我们需要在Django层注入header,用Django的第三方包django-cors-headers来解决跨域问题:

pip install django-cors-headers

settings.py 修改:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

CORS_ORIGIN_ALLOW_ALL = True

注意中间件的添加顺序

7、完成前端编写

在前端工程目录下,输入npm run dev启动node自带的服务器,浏览器会自动打开, 我们能看到页面:

 

尝试新增书籍,新增的书籍信息会实时反映到页面的列表中,这得益于Vue.js的数据双向绑定特性。

8、打包

在前端工程目录下,输入npm run build,如果项目没有错误的话,就能够看到所有的组件、css、图片等都被webpack自动打包到dist目录下了:

五、整合Django和Vue.js

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

1、更换主页

找到firstproject目录的urls.py,使用通用视图创建最简单的模板控制器,访问 『/』时直接返回 index.html:

from django.views.generic import TemplateView

urlpatterns = [
    re_path('admin/', admin.site.urls),
    re_path('api/', include(urls)),  # vue前端获取数据的url
    re_path('^$', TemplateView.as_view(template_name="index.html")),
]

2、修改模板配置

上一步使用了Django的模板系统,所以需要配置一下模板使Django知道从哪里找到index.html。在firstproject目录的settings.py下增加DIRS的值:

TEMPLATES = [
    {
        ...
        'DIRS': ['appfront/dist'],
        ...
]

3、修改静态文件路径

我们还需要配置一下静态文件的搜索路径。同样是project目录的settings.py下:

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

4、启动服务

配置完成,我们在firstproject目录下输入命令python manage.py runserver,前端页面:

 

注意服务的端口已经是Django服务的8000而不是node服务的8080了。

参考文档:https://cloud.tencent.com/developer/article/1005607

如有侵权,请联系公众号作者删除。

 

以上就是一个前后端分离的简单web项目构建过程,希望大家可以有所收获。

源码在公众号后台回复vue即可获取。

 

 

  • 3
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python是一种流行的编程语言,有非常丰富的库和框架可供使用。而Django是一个基于Python的开发框架,用于快速搭建Web应用程序。Vue是一种流行的JavaScript框架,用于构建用户界面。 当我们要搭建一个前后端分离的项目时,可以使用PythonDjango框架Vue框架来实现。下面是大致的步骤: 1. 对于后端,我们可以使用Django框架来搭建RESTful API。首先,创建一个新的Django项目并设置好相关配置。然后,定义数据模型和数据库表,可以使用Django的ORM(对象关系映射)来简化数据库操作。接下来,创建视图函数来处理不同的API请求,可以通过序列化器将模型数据转换为JSON格式进行传输。最后,设置URL路由映射和权限控制,确保API的安全性和可访问性。 2. 对于前端,我们可以使用Vue框架构建用户界面。首先,创建一个新的Vue项目并安装所需的依赖项。然后,创建组件来管理不同的页面和功能模块。在组件中,可以使用Vue的数据绑定和计算属性等功能来简化数据处理和状态管理。同时,可以使用Vue Router来管理页面之间的导航和路由,以及使用axios库来发送API请求和接收响应。 3. 在前后端之间进行通信时,前端通过axios发送HTTP请求到后端的API接口,后端处理请求并返回相应的数据。前端可以根据接口的返回结果来更新界面和展示数据。 总的来说,使用PythonDjango框架Vue框架可以很好地实现前后端分离的项目。Django提供了强大的后端支持,可以快速搭建API接口,而Vue框架则提供了便捷的前端开发环境,可以轻松构建用户界面。通过这种搭配,我们可以高效地开发出功能完善、交互流畅的Web应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值