前后端分离是现代 Web 开发的主流模式,核心是将页面渲染、交互逻辑(前端)与数据处理、业务逻辑(后端)解耦,通过标准化的 API 接口实现数据交互。本文以 Django(后端)+ Vue.js(前端)为例,详解前后端分离开发的核心流程、优势及实战技巧。
接下来我们就用前后端分离的方式来改写之前的投票应用。
后端核心职责是提供标准化的 JSON 格式数据接口,无需关注页面渲染,专注于数据处理和业务逻辑。
以 “获取学科列表” 为例,手动将模型对象转换为字典,再通过JsonResponse返回 JSON 数据:
defshow_subjects(request): queryset = Subject.objects.all() subjects = []for subject in queryset: subjects.append({'no': subject.no,'name': subject.name,'intro': subject.intro,'isHot': subject.is_hot })return JsonResponse(subjects, safe=False)手动转换对象为字典效率低、易出错,可使用bpmappers库(支持 Django 模型)快速实现对象→字典的映射。
步骤 1:安装依赖
pip install bpmappers步骤 2:编写模型映射器(Mapper)
from bpmappers.djangomodel import ModelMapperfrom poll2.models import SubjectclassSubjectMapper(ModelMapper):classMeta: model = Subject步骤 3:优化视图函数
defshow_subjects(request): queryset = Subject.objects.all() subjects = []for subject in queryset: subjects.append(SubjectMapper(subject).as_dict())return JsonResponse(subjects, safe=False)步骤 4:配置 URL 映射
urlpatterns = [ path('api/subjects/', show_subjects),]然后访问该接口,可以得到如下所示的JSON格式数据。
[{"no":1,"name":"Python全栈+人工智能","intro":"Python是一种计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。","is_hot":true},// 此处省略下面的内容]如果不希望在JSON数据中显示学科的成立时间,我们可以在映射器中排除create_date属性;如果希望将是否为热门学科对应的键取名为isHot(默认的名字是is_hot),也可以通过修改映射器来做到。具体的做法如下所示:
from bpmappers import RawFieldfrom bpmappers.djangomodel import ModelMapperfrom poll2.models import SubjectclassSubjectMapper(ModelMapper): isHot = RawField('is_hot')classMeta: model = Subject exclude = ('is_hot', )再次查看学科接口返回的JSON数据。
[{"no":101,"name":"Python全栈+人工智能","intro":"Python是一种计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。","isHot":true},// 此处省略下面的内容]关于bpmappers详细的使用指南,请参考它的官方文档,这个官方文档是用日语书写的,可以使用浏览器的翻译功能将它翻译成你熟悉的语言即可。
接下来我们通过前端框架Vue.js来实现页面的渲染。如果希望全面的了解和学习Vue.js,建议阅读它的官方教程或者在YouTube上搜索Vue.js的新手教程(Vue.js Crash Course)进行学习。
重新改写subjects.html页面,使用Vue.js来渲染页面。
<!DOCTYPE html><htmllang="en"><head><metacharset="UTF-8"><title>学科信息</title><style>/* 此处省略层叠样式表 */</style></head><body><divid="container"><h1>扣丁学堂所有学科</h1><hr><divid="main"><dlv-for="subject in subjects"><dt><a:href="'/static/html/teachers.html?sno=' + subject.no"> {{ subject.name }}</a><imgv-if="subject.is_hot"src="/static/images/hot-icon-small.png"></dt><dd>{{ subject.intro }}</dd></dl></div></div><scriptsrc="https://cdn.bootcdn.net/ajax/libs/vue/2.6.11/vue.min.js"></script><script>let app = newVue({el: '#main',data: {subjects: [] },created() {fetch('/api/subjects/') .then(resp => resp.json()) .then(json => {this.subjects = json }) } })</script></body></html>前后端分离的开发需要将前端页面作为静态资源进行部署,项目实际上线的时候,我们会对整个Web应用进行动静分离,静态资源通过Nginx或Apache服务器进行部署,生成动态内容的Python程序部署在uWSGI或者Gunicorn服务器上,对动态内容的请求由Nginx或Apache路由到uWSGI或Gunicorn服务器上。
在开发阶段,我们通常会使用Django自带的测试服务器,如果要尝试前后端分离,可以先将静态页面放在之前创建的放静态资源的目录下,具体的做法可以参考项目完整代码。
bpmappers可简化 Django 模型到 JSON 的序列化;fetch调用后端接口,利用v-for/v-if等指令实现数据驱动的页面渲染;django-cors-headers),生产环境建议动静分离部署(Nginx+uWSGI)。国内直接使用顶级AI工具
谷歌浏览器访问:
https://www.nezhasoft.cloud/r/vMPJZr
