本文用于学习django+vue.js实现web前后端分离协作开发。以一个添加和删除数据库书籍应用为实例。

django框架官方地址:https://www.djangoproject.com/

vue.js 框架官方地址:https://cn.vuejs.org/

一、构建django项目

1. 创建工程文件和APP

创建django_vue

django-admin startproject django_vue

进入django_vue,创建虚拟环境django_vue_env

pip install virtualenv  #安装
virtualenv django_vue_env

激活虚拟环境,并安装django

source ./django_vue_env/bin/activate

安装 django、后面用到的django-cors-headers(跨域)、requests

创建django app

python manage.py startapp app

我们的目录应该是这样的,appfront为vue项目会在后面创建。

数据库我们使用默认sqlite3 即可,如需要变更可在setting.py中databases配置。

添加app到INSTALLED_APPS

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

添加数据库模型,包含book_name和add_time用于记录书籍名称和添加时间。

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 __str__(self):
return self.book_name

做数据库迁移

python manage.py makemigrations app
python manage.py migrate

编写views.py添加 show_books 和add_book两个api接口,通过JsonResponse将请求数据返回。

from django.shortcuts import render

# Create your views here.
# 需要导入相关的模块
from django.http import JsonResponse
from django.views.decorators.http import require_http_methods
from django.core import serializers
import requests
import json from .models import Book @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)

在django_vue目录下urls.py添加api路由

from django.contrib import admin
from django.urls import path,include
import app.urls urlpatterns = [
path('admin/', admin.site.urls),
path('api/',include(app.urls)),
]

在app目录下的urls.py添加视图路由

from django.urls import path,re_path
# 导入 myapp 应用的 views 文件
from . import views urlpatterns = [
re_path(r'add_book$', views.add_book),
re_path(r'show_books$', views.show_books)
]

重启服务,通过curl命令测试api可用性,如下接口正常。

 python manage.py runserver

 curl  http://127.0.0.1:8000/api/add_book?book_name=mylife

 {"msg": "success", "error_num": 0}

 curl  http://127.0.0.1:8000/api/show_books

 {"list": [ {"model": "app.book", "pk": 9, "fields": {"book_name": "mylife", "add_time": "2021-06-16T14:44:49.230Z"}}], "msg": "success", "error_num": 0}

django后端大致构建完成,接下来做vue前端。


一、构建vue项目

安装vue初始化命令行工具vue-cli

npm install -g vue-cli

在django_vue目录下构建前端工程appfront,其中包含webpack工具。

vue-init webpack appfront

appfront目录如下

安装渲染element-uivue-resource

npm install element-ui
npm install vue-resource

调整src/main.js如下

import Vue from 'vue'
import App from './App'
import router from './router'
import ElementUI from 'element-ui'
import VueResource from 'vue-resource'
import 'element-ui/lib/theme-chalk/index.css' Vue.config.productionTip = false
Vue.use(ElementUI)
Vue.use(VueResource)
/* eslint-disable no-new */
new Vue({
el: '#app',
router,
components: { App },
template: '<App/>'
})

src/component目录下新建Home.vue,包含showBooksaddBook两个方法用于api查询。

<template>
<div class="home">
<el-row display="margin-top:10px">
<el-input v-model="input" placeholder="请输入书名" style="display:inline-table; width: 30%; float:left"></el-input>
<el-button type="primary" @click="addBook()" style="float:left; margin: 2px;">新增</el-button>
</el-row>
<el-row>
<el-table :data="bookList" style="width: 100%" border>
<el-table-column prop="id" label="编号" min-width="100">
<template scope="scope"> {{ scope.row.pk }} </template>
</el-table-column>
<el-table-column prop="book_name" label="书名" min-width="100">
<template scope="scope"> {{ scope.row.fields.book_name }} </template>
</el-table-column>
<el-table-column prop="add_time" label="添加时间" min-width="100">
<template scope="scope"> {{ scope.row.fields.add_time }} </template>
</el-table-column>
</el-table>
</el-row>
</div>
</template> <script>
export default {
name: 'home',
data () {
return {
input: '',
bookList: [],
}
},
mounted: function() {
this.showBooks()
},
methods: {
addBook(){
this.$http.get('http://139.198.114.148:8000/api/add_book?book_name=' + this.input)
.then((response) => {
var res = JSON.parse(response.bodyText)
if (res.error_num == 0) {
this.showBooks()
} else {
this.$message.error('新增书籍失败,请重试')
console.log(res['msg'])
}
})
},
showBooks(){
this.$http.get('http://139.198.114.148:8000/api/show_books')
.then((response) => {
var res = JSON.parse(response.bodyText)
console.log(res)
if (res.error_num == 0) {
this.bookList = res['list']
} else {
this.$message.error('查询书籍失败')
console.log(res['msg'])
}
})
}
}
}
</script> <!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
h1, h2 {
font-weight: normal;
}
ul {
list-style-type: none;
padding: 0;
}
li {
display: inline-block;
margin: 0 10px;
}
a {
color: #42b983;
}
</style>

我们通过django-cors-headers处理跨域问题

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app',
'corsheaders', //添加app
]

添加中间件corsheaders.middleware.CorsMiddleware

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

在setting.py中配置跨域规则

CORS_ALLOW_METHODS = (
'DELETE',
'GET',
'OPTIONS',
'PATCH',
'POST',
'PUT',
'VIEW',
) CORS_ALLOW_HEADERS = (
'accept',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
)

npm run dev启动node服务器

通过npm run build打包前端到dist目录,用于后续django链接。


三、django链接到前端

调整django_vue目录下路由urls.py如下

from django.contrib import admin
from django.urls import path,include
from django.views.generic import TemplateView //导入通用视图
import app.urls urlpatterns = [
path('admin/', admin.site.urls),
path('api/',include(app.urls)),
path('',TemplateView.as_view(template_name="index.html")), //路由到index.html
]

在setting.py下添加静态文件地址

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

启动django 服务

python manage.py runserver

访问我们的django地址,此时django已链接到前端


参考:https://github.com/rogerlh/django_with_vue

NEXT

  • django-rest-framework 创建restful api
  • django wsgi的应用

文章有不足的地方欢迎在评论区指出。

欢迎收藏、点赞、提问。关注顶级饮水机管理员,除了管烧热水,有时还做点别的。

python django框架+vue.js前后端分离的更多相关文章

  1. 全宇宙首个.NET5+Vue.js前后端分离以及业务模块化快速开发框架【NetModular】发布~

    最近.Net圈子很热闹啊,我也来凑凑,今天中午耗时长达半小时,把NetModular升级到了.NET5,详情查看分支https://github.com/iamoldli/NetModular/tre ...

  2. Tornado + vue.js 前后端分离运行脚本

    shell脚本部分: #!/bin/bash 主脚本 (./cem-demo_publish_front) (./cem-demo_publish_backend) #!/bin/bash 后端脚本 ...

  3. Flask & Vue 构建前后端分离的应用

    Flask & Vue 构建前后端分离的应用 最近在使用 Flask 制作基于 HTML5 的桌面应用,前面写过<用 Python 构建 web 应用>,借助于完善的 Flask ...

  4. vue+springboot前后端分离实现单点登录跨域问题处理

    最近在做一个后台管理系统,前端是用时下火热的vue.js,后台是基于springboot的.因为后台系统没有登录功能,但是公司要求统一登录,登录认证统一使用.net项目组的认证系统.那就意味着做单点登 ...

  5. gin+vue的前后端分离开源项目

    该项目是gin+vue的前后端分离项目,使用gorm访问MySQL,其中vue前端是使用vue-element-admin框架简单实现的: go后台使用jwt,对API接口进行权限控制.此外,Web页 ...

  6. 一套基于SpringBoot+Vue+Shiro 前后端分离 开发的代码生成器

    一.前言 最近花了一个月时间完成了一套基于Spring Boot+Vue+Shiro前后端分离的代码生成器,目前项目代码已基本完成 止步传统CRUD,进阶代码优化: 该项目可根据数据库字段动态生成 c ...

  7. docker-compose 部署 Vue+SpringBoot 前后端分离项目

    一.前言 本文将通过docker-compose来部署前端Vue项目到Nginx中,和运行后端SpringBoot项目 服务器基本环境: CentOS7.3 Dokcer MySQL 二.docker ...

  8. SpringBoot+Jpa+SpringSecurity+Redis+Vue的前后端分离开源系统

    项目简介: eladmin基于 Spring Boot 2.1.0 . Jpa. Spring Security.redis.Vue的前后端分离的后台管理系统,项目采用分模块开发方式, 权限控制采用 ...

  9. 【转】python+django+vue搭建前后端分离项目

    https://www.cnblogs.com/zhixi/p/9996832.html 以前一直是做基于PHP或JAVA的前后端分离开发,最近跟着python风搭建了一个基于django的前后端分享 ...

随机推荐

  1. 如何在jQuery的Ajax调用后管理一个重定向请求

    1 success:function(data){ 2 if(data.xx == "xx") 3 { 4 //code... 5 window.location.href =&q ...

  2. Andrew Ng机器学习算法入门(八):正规方程

    正规方程 在先学习正规方程之前,先来复习一下之前学过的常规的回归方程的解法. 假设存在如果的代价函数, ,解法也十分的简答. 但是有时候遇到的情况或许会变得相当的复杂. 的数,如果是按照常规的方式进行 ...

  3. jquery常用操作整理

    1.数据中添加或者删除指定元素 var  arr=['red','yello','blue']; arr.push('green');  //添加元素 arr = $.grep(arr,functio ...

  4. mysql用户创建触发器权限不足跟参数log_bin_trust_function_creators

    问题描述 有业务反馈当前用户无法创建触发器和存储过程,让用户自己测试,该用户进行对表的增删改查等其他权限没有问题,这边用root用户查证,该用户拥有对当前库的所有权限,但是为什么就是创建不了触发器呢? ...

  5. 全套visio版本安装教程及下载地址

    1:visio 2003 安装教程及下载地址 https://mp.weixin.qq.com/s/vhJUagKBz3vM-Dru0cwYow 2:visio 2007 安装教程及下载地址 http ...

  6. DWVA--File Inclusion

    文件包含漏洞 先来了解一下什么是文件包含 因为程序开放人员通常会把可重复使用的函数写到单个文件中,在需要使用到这些函数时候,就可以 直接调用这个文件,这种对文件的调用过程就被称为文件包含. 文件包含漏 ...

  7. ElasticSearch第三弹之存储原理

    我们上文中介绍的ES内部索引的写处理流程是在ES的内存中执行的,而数据被分配到特定的主.副分片上之后,最终是存储到磁盘上的,这样在断电的时候就不会丢失数据.具体的存储路径可在配置文件 ../confi ...

  8. 老J的技术分享之总结

    老J做IT这块有二十多个年头了,算是中国IT的见证者与参与者.那个时候刚开始接触和了解时,对于他的一些建议,我不是很乐于去接受,因为我觉得他的那一套技术体系不是很适合如今的情况,当时间久了后发现,他对 ...

  9. Electron-Vue3-Vadmin后台系统|vite2+electron桌面端权限管理系统

    基于vite2.x+electron12桌面端后台管理系统Vite2ElectronVAdmin. 继上一次分享vite2整合electron搭建后台框架,这次带来的是最新开发的跨桌面中后台权限管理系 ...

  10. valgrind 内存泄漏分析

    概述 valgrind 官网 https://www.valgrind.org/ valgrind 是 Linux 业界主流且非常强大的内存泄漏检查工具.在其官网介绍中,内存检查(memcheck)只 ...