0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于Django+Vue的前后端分离开发教程

科技绿洲 来源:Python实用宝典 作者:Python实用宝典 2023-11-01 09:22 次阅读

众所周知,Django对于网站快速开发非常友好,这得益于框架为我们做了很多事情,让我们只需要做一些简单的配置和逻辑即可把网站的功能开发出来。

但是,在使用Django的过程中,有一个地方一直是比较难受的,那就是使用Django自带的模版,这种通常需要自己利用HTML+CSS+Jquery的方式总感觉是上一个时代的做法,前后端分离无论对于开发效率、多端支持等等都是很有好处的。

所以,本文希望通过一个简单的demo,讲一讲基于Django+Vue的前后端分离开发,将Django作为一个纯后端的服务,为前端Vue页面提供数据支持。

本文采用的django版本号2.2.5,Vue版本2.9.6。

开始之前,你要确保Pythonpip已经成功安装在电脑上,如果没有,可以访问这篇文章:超详细Python安装指南 进行安装。

(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

(可选2) 此外,推荐大家用VSCode编辑器,它有许多的优点:Python 编程的最好搭档—VSCode 详细指南

请选择以下任一种方式输入命令安装依赖

  1. Windows 环境 打开 Cmd (开始-运行-CMD)。
  2. MacOS 环境 打开 Terminal (command+空格输入Terminal)。
  3. 如果你用的是 VSCode编辑器 或 Pycharm,可以直接使用界面下方的Terminal.
pip install django

vue的安装可见:
https://www.runoob.com/vue2/vue-install.html

创建前后端项目:创建一个文件夹,然后命令行创建项目即可,如下图:

图片

命令行进入后端文件夹 book_demo,输入下面命令,浏览器登陆 127.0.0.1:8000 看见欢迎页即成功。

python manage.py runserver

再进入前端文件夹 appfront ,输入下面命令,浏览器登陆 127.0.0.1:8080 看见欢迎页即成功。

npm run dev

上面两个命令也是对应前后端项目的启动命令,后面就直接将过程说成启动前/后端项目。

2.后端实现

为了方便后端的实现,作为django做后端api服务的一种常用插件,django-rest-framework(DRF)提供了许多好用的特性,所以本文demo中也应用一下,命令行输入命令安装:

pip install django-rest-framework

进入book_demo目录,创建一个新的名为books的应用,并在新应用中添加urls.py文件,方便后面的路由配置,命令行输入:

python manage.py startapp books
cd books
touch urls.py

现在的目录结构如下:

图片

下面开始做一些简单的配置:

将DRF和books配置到django项目中,打开项目中的** settings.py **文件,添加:

# book_demo/settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    # demo add
    'rest_framework',
    'books',
]

对整个项目的路由进行配置,让访问 api/ 路径时候转到books应用中的urls.py文件配置进行处理。

# book_demo/settings.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('books.urls')), # demo add
]

下面在books应用中写简单的逻辑,demo只最简单涉及对书本的增删改查。因为这一部分不是本文重点,所以这里只介绍写代码流程和贴代码,对代码不做详细解释:

在models.py文件中写简单数据类Books:

# books/models.py
from django.db import models


class Books(models.Model):
    name = models.CharField(max_length=30)
    author = models.CharField(max_length=30, blank=True, null=True)

在books文件夹中创建serializer.py文件,并写对应序列化器BooksSerializer:

# books/serializer.py
from rest_framework import serializers

from books.models import Books


class BooksSerializer(serializers.ModelSerializer):
    class Meta:
        model = Books
        fields = '__all__'

在views.py文件中写对应的视图集BooksViewSet来处理请求:

# books/views.py
from rest_framework import viewsets

from books.models import Books
from books.serializer import BooksSerializer


class BooksViewSet(viewsets.ModelViewSet):
    queryset = Books.objects.all()
    serializer_class = BooksSerializer

在urls.py文件中写对应的路由映射:

# books/urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter

from books import views


router = DefaultRouter()
router.register('books', views.BooksViewSet)

urlpatterns = [
    path('', include(router.urls)),
]

对于books应用中的内容,如果对DRF和Django流程熟悉的同学肯定知道都干了些什么,篇幅关系这里只能简单解释,DRF通过视图集ViewSet的方式让我们对某一个数据类Model可以进行增删改查,而且不同的操作对应于不同的请求方式,比如查看所有books用get方法,添加一本book用post方法等,让整个后端服务是restful的。

如果实在看不懂代码含义,只需知道这样做之后就可以通过不同的网络请求对后端数据库的Books数据进行操作即可,后续可以结合Django和DRF官方文档对代码进行学习,或关注本人未来分享的内容。

到这里,可以运行一下后端项目看看效果,命令行运行:

python manage.py makemigrations
python manage.py migrate
python manage.py runserver

得益于DRF提供的api可视化界面,浏览器访问 ** 127.0.0.1:8000/api/books/ ** ,如果出现了以下界面并添加数据正常,则说明后端的基本逻辑已经ok了~下图为添加了一条数据之后的效果。

图片

3.前端实现

接下来的工作以appfront项目目录为根目录进行,开始写一点前端的展示和表单,希望达到两个目标,一是能从后端请求到所有的books列表,二是能往后端添加一条book数据。说白了就是希望把上面的页面用Vue简单实现一下,然后能达到相同的功能。

对于Vue项目中各个文件的功能这里也不多解释,可以参考其文档系统学习。这里只需要知道欢迎页面中的样式是写在App.vue和components/HelloWorld.vue中即可。

这里直接用HelloWorld.vue进行修改,只求功能不追求页面了~

上滑查看更多代码

// appfront/src/components/HelloWorld.vue
< template >
  < div class="hello" >
    < h1 >{{ msg }}< /h1 >
    < !-- show books list -- >
    < ul >
      < li v-for="(book, index) in books" :key="index" style="display:block" >
        {{index}}-{{book.name}}-{{book.author}}
      < /li >
    < /ul >
    < !-- form to add a book -- >
    < form action="" >
      输入书名:< input type="text" placeholder="book name" v-model="inputBook.name" >< br >
      输入作者:< input type="text" placeholder="book author" v-model="inputBook.author" >< br >
    < /form >
    < button type="submit" @click="bookSubmit()" >submit< /button >
  < /div >
< /template >

< script >
export default {
  name: 'HelloWorld',
  data () {
    return {
      msg: 'Welcome to Your Vue.js App',
      // books list data
      books: [
        {name: 'test', author: 't'},
        {name: 'test2', author: 't2'}
      ],
      // book data in the form
      inputBook: {
        "name": "",
        "author": "",
      }
    }
  },
  methods: {
    loadBooks () {...}, // load books list when visit the page
    bookSubmit () {...} // add a book to backend when click the button
  },
  created: function () {
    this.loadBooks()
  }
}
< /script >
...

启动前端项目,浏览器访问127.0.0.1:8080,可以看到刚写的页面已经更新上去了,丑是丑了点,意思到了就行~如下图:

图片

4.前后端联调

敲黑板,重点来了!!上面的页面中数据其实是写死在前端页面的模拟数据,这一节希望通过从后端拿数据并展示在前端页面的方式来完成前后端联调。前后端联调,涉及最多的就是跨域的问题,为了保证安全,通常需要遵循同源策略,即“协议、域名、端口”三者都相同,具体可以看看相关的博客,这里只需知道上述三者相同才算同源即可。

后端部分,对于django的跨域问题,网上比较常用的做法就是利用django-cors-headers模块来解决,这里也不能免俗,操作如下。

先在命令行中进行对应模块的安装:

pip install django-cors-headers

然后在项目中添加该模块:

# books_demo/settings.py
INSTALLED_APPS = [
    ...
    # demo
    'corsheaders',
    ...
]

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware', # 需注意与其他中间件顺序,这里放在最前面即可
    ...
]

# 支持跨域配置开始
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True

后端部分告于段落,接下来需要补充一下前端的逻辑,Vue框架现在一般都用axios模块进行网络请求,这里沿用这种方式,下面是在前端项目中操作:

首先命令行安装axios模块,如果没有安装cnpm就还是用npm安装:

cnpm install axios

为了方便管理api请求的各种逻辑,在前端项目的src目录下创建api目录,然后创建api.js和index.js文件。index.js文件是对axios做配置:

// appfront/src/api/index.js
import Vue from 'vue'
import Axios from 'axios'

const axiosInstance = Axios.create({
    withCredentials: true
})

// 通过拦截器处理csrf问题,这里的正则和匹配下标可能需要根据实际情况小改动
axiosInstance.interceptors.request.use((config) = > {
    config.headers['X-Requested-With'] = 'XMLHttpRequest'
    const regex = /.*csrftoken=([^;.]*).*$/
    config.headers['X-CSRFToken'] = document.cookie.match(regex) === null ? null : document.cookie.match(regex)[1]
    return config
})

axiosInstance.interceptors.response.use(
    response = > {
        return response
    },
    error = > {
        return Promise.reject(error)
    }
)

Vue.prototype.axios = axiosInstance

export default axiosInstance

api.js文件是对后端进行请求,可以看到,获取books列表和添加一本book各对应于一个请求:

// appfront/src/api/api.js
import axiosInstance from './index'

const axios = axiosInstance

export const getBooks = () = > {return axios.get(`http://localhost:8000/api/books/`)}

export const postBook = (bookName, bookAuthor) = > {return axios.post(`http://localhost:8000/api/books/`, {'name': bookName, 'author': bookAuthor})}

然后更新HelloWorld.vue中的处理逻辑:

// appfront/src/components/HelloWorld.vue
< script >
import {getBooks, postBook} from '../api/api.js'
export default {
  ...
  methods: {
    loadBooks () {
      getBooks().then(response = > {
        this.books = response.data
      })
    }, // load books list when visit the page
    bookSubmit () {
      postBook(this.inputBook.name, this.inputBook.author).then(response = > {
        console.log(response)
        this.loadBooks()
      })
    } // add a book to backend when click the button
  },
  ...
}
< /script >

至此,一个极其简陋的查询和添加书籍的功能算是完成了~如下图:

图片

图片

可以看到,列表里面的数据是从后端读取到的,同时前端的提交数据库也能有对应的操作,所以前后端至此是打通了。

5.打包‍‍

现阶段是前后端分开开发,但是当最后要用的时候,还需要把代码合在一起。

首先对前端项目进行打包,这里用Vue的自动打包:

npm run build

可以看到前端项目中多出了一个dist文件夹,这个就是前端文件的打包结果。需要把dist文件夹复制到books_demo项目文件夹中。

然后对settings.py文件进行相应的修改,其实就是帮django指定模版文件和静态文件的搜索地址:

# books_demo/books_demo/settings.py
...
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'dist')], # demo add
        ...
    },
]
...
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'dist/static'),
]
..

最后在根urls.py文件中配置一下入口html文件的对应路由:

# books_demo/books_demo/urls.py
...
from django.views.generic.base import TemplateView

urlpatterns = [
    ...
    path('', TemplateView.as_view(template_name='index.html'))
]

重新启动项目,这次用浏览器访问 ** 127.0.0.1:8000 ** ,即django服务的对应端口即可。

可以看到,项目的交互是正常的,符合我们的预期。

总结

本文以一个非常简单的demo为例,介绍了利用django+drf+vue的前后端分离开发模式,基本可以算是手把手入门。有了这个小demo之后,不管是前端页面还是后端功能,都可以做相应的扩展,从而开发出更加复杂使用的网站。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 框架
    +关注

    关注

    0

    文章

    397

    浏览量

    17388
  • 网站
    +关注

    关注

    1

    文章

    256

    浏览量

    23120
  • 开发教程
    +关注

    关注

    0

    文章

    7

    浏览量

    9463
  • Django
    +关注

    关注

    0

    文章

    43

    浏览量

    10356
  • vue
    vue
    +关注

    关注

    0

    文章

    57

    浏览量

    7784
收藏 人收藏

    评论

    相关推荐

    Django3如何使用WebSocket实现WebShell

    前言最近工作中需要开发前端操作远程虚拟机的功能,简称 WebShell。基于当前的技术栈为 react+django,调研了一会发现大部分的后端实现都是 django+channels
    的头像 发表于 11-17 09:58 4294次阅读

    Koa+Mysql2+Vue前后端综合例子分享

    「Node学习」Koa+Mysql2+Vue前后端综合例子
    发表于 06-02 17:38

    jqgrid前后端交互实例分享

    [温习]jqgrid 前后端交互实例
    发表于 06-10 17:30

    web前后端的优化实现

    当web前后端的基本功能实现以后,就需要考虑优化的问题,如何提高速度,如何充分利用现有的资源,如何根据现有的硬件资源作软件适配优化等等。这些都是开发后期的工作重心。本文以嵌入式平台的服务器为例,总结
    发表于 12-16 07:31

    Dragonboard 410c搭载web服务器之后端数据交互

    本系列文章,博主已经给大家介绍了几种python的django架构应用实例,包括web用户注册登陆系统,博客系统,用户视频上传等等,相信有看过博主上传过的实例的童鞋应该会对django简洁实用的代码架构所吸引,今天,我们就来分享下Dja
    发表于 02-09 10:40 961次阅读
    Dragonboard 410c搭载web服务器之<b class='flag-5'>后端</b>数据交互

    vue-cli开发环境实现跨域请求

    前后端分离开发中必要会遇到的问题—跨域。在使用vue开发的时候,开始为了解决跨域问题。采用的是CORS(Cross-origin resource sharing)。后台在响应头中添加
    发表于 11-28 13:15 1021次阅读

    后端工程师怎样快速掌握前端开发技能

    初入软件开发这一行时,当时还没有前后端分离这个概念,所有的开发工程师既能写html,也能写后台服务,随着技术的发展,前后端
    的头像 发表于 09-21 10:34 2947次阅读

    web开发django快速使用指南

    使用python开发web中,使用Django,使你能够以最小的代价构建和维护高质量的Web应用。在Python各种web框架中,Django的文档最完善,虽然django也有自己的部
    的头像 发表于 05-05 22:19 3215次阅读
    web<b class='flag-5'>开发</b>中<b class='flag-5'>django</b>快速使用指南

    python七天实战入门Django Web开发的PDF电子书免费下载

    开发的读者: • 清晰的架构 • 完整的功能 • 丰富的文档对于一个想要使用 Python 语言进行 Web 开发的新手来说,Django 将数据模型、业务处理函数和页面渲染的模板分离开
    发表于 12-22 08:00 6次下载
    python七天实战入门<b class='flag-5'>Django</b> Web<b class='flag-5'>开发</b>的PDF电子书免费下载

    Django应用程序开发中设计Django模板的方法

    在本文中,我将介绍在Django应用程序开发中设计Django模板的方法。目的是保持Django应用程序的UI部分井井有条,并避免重复编码。Djan
    的头像 发表于 07-29 15:44 1824次阅读

    RuoYi-Vue前后端分离权限管理系统

    gitee-RuoYi-Vue.zip
    发表于 05-07 10:09 0次下载
    RuoYi-<b class='flag-5'>Vue</b><b class='flag-5'>前后端</b><b class='flag-5'>分离</b>权限管理系统

    前后端分离必备的接口规范

    随着互联网的高速发展,前端页面的展示、交互体验越来越灵活、炫丽,响应体验也要求越来越高,后端服务的高并发、高可用、高性能、高扩展等特性的要求也愈加苛刻,从而导致前后端研发各自专注于自己擅长的领域深耕细作。
    的头像 发表于 05-15 17:16 788次阅读
    <b class='flag-5'>前后端</b><b class='flag-5'>分离</b>必备的接口规范

    迅为国产化RK3588开发板在安防前后端应用解决方案

    迅为国产化RK3588开发板在安防前后端应用解决方案
    的头像 发表于 05-10 16:04 932次阅读
    迅为国产化RK3588<b class='flag-5'>开发</b>板在安防<b class='flag-5'>前后端</b>应用解决方案

    springboot前后端交互流程

    Boot 进行开发时,前后端交互是一个非常重要的部分,本文将详细介绍 Spring Boot 前后端交互的流程。 前后端交互的基本原理 在前后端
    的头像 发表于 11-22 16:00 1956次阅读

    基于springboot和vue框架的Java

    Vue项目的环境,并展示从前端到后端的完整开发流程。接着,将重点关注前后端分离开发模式,并介
    的头像 发表于 12-03 15:15 912次阅读