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

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

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

一、构建django项目

1. 创建工程文件和APP

创建django_vue

  1. django-admin startproject django_vue

进入django_vue,创建虚拟环境django_vue_env

  1. pip install virtualenv #安装
  2. virtualenv django_vue_env

激活虚拟环境,并安装django

  1. source ./django_vue_env/bin/activate

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

创建django app

  1. python manage.py startapp app

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

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

添加app到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. 'app'
  9. ]

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

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

做数据库迁移

  1. python manage.py makemigrations app
  2. python manage.py migrate

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

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

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

  1. from django.contrib import admin
  2. from django.urls import path,include
  3. import app.urls
  4. urlpatterns = [
  5. path('admin/', admin.site.urls),
  6. path('api/',include(app.urls)),
  7. ]

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

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

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

  1. python manage.py runserver
  2. curl http://127.0.0.1:8000/api/add_book?book_name=mylife
  3. {"msg": "success", "error_num": 0}
  4. curl http://127.0.0.1:8000/api/show_books
  5. {"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

  1. npm install -g vue-cli

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

  1. vue-init webpack appfront

appfront目录如下

安装渲染element-uivue-resource

  1. npm install element-ui
  2. npm install vue-resource

调整src/main.js如下

  1. import Vue from 'vue'
  2. import App from './App'
  3. import router from './router'
  4. import ElementUI from 'element-ui'
  5. import VueResource from 'vue-resource'
  6. import 'element-ui/lib/theme-chalk/index.css'
  7. Vue.config.productionTip = false
  8. Vue.use(ElementUI)
  9. Vue.use(VueResource)
  10. /* eslint-disable no-new */
  11. new Vue({
  12. el: '#app',
  13. router,
  14. components: { App },
  15. template: '<App/>'
  16. })

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

  1. <template>
  2. <div class="home">
  3. <el-row display="margin-top:10px">
  4. <el-input v-model="input" 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="bookList" style="width: 100%" border>
  9. <el-table-column prop="id" label="编号" min-width="100">
  10. <template scope="scope"> {{ scope.row.pk }} </template>
  11. </el-table-column>
  12. <el-table-column prop="book_name" label="书名" min-width="100">
  13. <template scope="scope"> {{ scope.row.fields.book_name }} </template>
  14. </el-table-column>
  15. <el-table-column prop="add_time" label="添加时间" min-width="100">
  16. <template scope="scope"> {{ scope.row.fields.add_time }} </template>
  17. </el-table-column>
  18. </el-table>
  19. </el-row>
  20. </div>
  21. </template>
  22. <script>
  23. export default {
  24. name: 'home',
  25. data () {
  26. return {
  27. input: '',
  28. bookList: [],
  29. }
  30. },
  31. mounted: function() {
  32. this.showBooks()
  33. },
  34. methods: {
  35. addBook(){
  36. this.$http.get('http://139.198.114.148:8000/api/add_book?book_name=' + this.input)
  37. .then((response) => {
  38. var res = JSON.parse(response.bodyText)
  39. if (res.error_num == 0) {
  40. this.showBooks()
  41. } else {
  42. this.$message.error('新增书籍失败,请重试')
  43. console.log(res['msg'])
  44. }
  45. })
  46. },
  47. showBooks(){
  48. this.$http.get('http://139.198.114.148:8000/api/show_books')
  49. .then((response) => {
  50. var res = JSON.parse(response.bodyText)
  51. console.log(res)
  52. if (res.error_num == 0) {
  53. this.bookList = res['list']
  54. } else {
  55. this.$message.error('查询书籍失败')
  56. console.log(res['msg'])
  57. }
  58. })
  59. }
  60. }
  61. }
  62. </script>
  63. <!-- Add "scoped" attribute to limit CSS to this component only -->
  64. <style scoped>
  65. h1, h2 {
  66. font-weight: normal;
  67. }
  68. ul {
  69. list-style-type: none;
  70. padding: 0;
  71. }
  72. li {
  73. display: inline-block;
  74. margin: 0 10px;
  75. }
  76. a {
  77. color: #42b983;
  78. }
  79. </style>

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

  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. 'app',
  9. 'corsheaders', //添加app
  10. ]

添加中间件corsheaders.middleware.CorsMiddleware

  1. MIDDLEWARE = [
  2. 'django.middleware.security.SecurityMiddleware',
  3. 'django.contrib.sessions.middleware.SessionMiddleware',
  4. 'django.middleware.common.CommonMiddleware',
  5. 'django.middleware.csrf.CsrfViewMiddleware',
  6. 'corsheaders.middleware.CorsMiddleware',
  7. 'django.contrib.auth.middleware.AuthenticationMiddleware',
  8. 'django.contrib.messages.middleware.MessageMiddleware',
  9. 'django.middleware.clickjacking.XFrameOptionsMiddleware',
  10. ]

在setting.py中配置跨域规则

  1. CORS_ALLOW_METHODS = (
  2. 'DELETE',
  3. 'GET',
  4. 'OPTIONS',
  5. 'PATCH',
  6. 'POST',
  7. 'PUT',
  8. 'VIEW',
  9. )
  10. CORS_ALLOW_HEADERS = (
  11. 'accept',
  12. 'accept-encoding',
  13. 'authorization',
  14. 'content-type',
  15. 'dnt',
  16. 'origin',
  17. 'user-agent',
  18. 'x-csrftoken',
  19. 'x-requested-with',
  20. )

npm run dev启动node服务器

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


三、django链接到前端

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

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

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

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

启动django 服务

  1. 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. Windows Pe 第三章 PE头文件(中)

    这一章的上半部分大体介绍了下PE文件头,下半部分是详细介绍里面的内容,这一章一定要多读几遍,好好记记基础概念和知识,方便之后的学习. 简单回忆一下: 3.4  PE文件头部解析 3.4.1 DOS M ...

  2. CCNA 第二章 以太网回顾

    1:半双工和全双工 (1):半双工:类似于单车道: (2):全双工:类似是双向多车道: 2:思科三层模型 (1): (2):核心层.集散层(汇聚层).接入层各功能: 1:核心层:大量数据快速交换:不要 ...

  3. Pytest自动化测试-简易入门教程(03)

    今天分享内容的重点,和大家来讲一下我们的测试框架--Pytest 讲到这个框架的话呢,可能有伙伴就会问老师,我在学习自动化测试过程中,我们要去学一些什么东西? 第一个肯定要学会的是一门编程语言,比如说 ...

  4. HelloGitHub 小程序上线了,蛋只有一个搜索功能

    作者:HelloGitHub-卤蛋 我是...蛋蛋啊,本文是我从零开发「HelloGitHub 小程序」的开发日记,不要把这个系列当作技术文章来读,你将会收获更多的乐趣.‍♂️ 我只是个 Python ...

  5. .NET平台系列5 .NET Core 简介

    系列目录     [已更新最新开发文章,点击查看详细] 自1995年互联网战略日以来最雄心勃勃的事业 -- 微软.NET战略, 2000年6月30日. 微软公司于2002年2月13日正式推出第一代.N ...

  6. 运维告诉我CPU飙升300%,为什么我的程序上线就奔溃了

    线上服务CPU飙升 前言 功能开发完成仅仅是项目周期中的第一步,一个完美的项目是在运行期体现的 今天我们就来看看笔者之前遇到的一个问题CPU飙升的问题. 代码层面从功能上看没有任何问题但是投入使用后却 ...

  7. 中文NER的那些事儿2. 多任务,对抗迁移学习详解&代码实现

    第一章我们简单了解了NER任务和基线模型Bert-Bilstm-CRF基线模型详解&代码实现,这一章按解决问题的方法来划分,我们聊聊多任务学习,和对抗迁移学习是如何优化实体识别中边界模糊,垂直 ...

  8. web自动化框架—BasePage 类的简单封装

    优秀的框架都有属于自己的思想,在搭建web自动化测试框架时,我们通常都遵循 PO(Page Object)思想. 简单理解就是我们会把每个页面看成一个对象,一切皆对象,面向对象编码,这样会让我们更好的 ...

  9. Codeforces Round #687 (Div. 2, based on Technocup 2021 Elimination Round 2)

    A. Prison Break 题意:就是在一个n*m的矩阵中,以(1,1)为起点(n,m)为终点,每个点以每个单位1s的速度移动,问总共至少需要多少秒,所有的矩阵点就能够全部移动到(r,c)中 思路 ...

  10. "mysql第一次查询很慢,以后就很快"的解决方案

    背景 有个项目使用的mysql数据库,第一次查询很慢,大约15s左右出结果,再次查询就很快了. 分析 后面变快的原因是mysql有缓存机制,但是过上一段时间不使用缓存会过期,我个人测了一下2~3分钟一 ...