前后端分离概述
前端(英语:front-end)和后端(英语:back-end)是描述进程开始和结束的通用词汇。前端作用于采集输入信息,后端进行处理。计算机程序的界面样式,视觉呈现属于前端。在软体架构和程序设计领域,前端是软体系统中直接和用户交互的部分,而后端控制着软件的输出。将软体分为前端和后端是一种将软体的不同的功能部分相互分离的抽象的划分方式。
在传统的Web应用开发中,大多数的程序员会将浏览器作为前后端的分界线。将浏览器中为用户进行页面展示的部分称之为前端,而将运行在服务器,为前端提供业务逻辑和数据准备的所有代码统称为后端。
相较于使用MVC框架,前后端开发未能分离的时期,前后端分离的开发具有很多的优势:
能够有效地实现前后端代码的解耦合,前后端的开发变得相对独立,且不会出现之前那样相互制约的情况,这为前后端工程师的开发工作提供了极大的便利,开发工作变得更加简单和高效。
代码的更新和维护变得更加简单,在前后端代码未能实现较好的解耦合的时期,在对代码进行更新和维护的时候常常会出现牵一发而动全身的现象,而前后端分离的开发则有效地规避了这种现象。
可扩展和可移植性更强,为以后的大型分布式架构、弹性计算架构、微服务架构、多端化服务(多种客户端,例如:浏览器,车载终端,安卓,IOS等等)打下坚实的基础。
前后端开发的核心思想就是:前端HTML页面通过AJAX调用后端的RESTFUL API接口并使用JSON数据进行交互。
后端
诚如上文中提到的那样,在前后端分离的开发模式下,后端的工作主要是为前端提供数据接口,而这些接口提供的通常是JSON格式的数据。
在Django的框架下,我们可以利用它自带的函数JsonResponse
向浏览器返回Json格式的数据
def show_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)
"""
这里需要注意,JsonResponse默认是将列表序列化成json格式的数据,当我们希望对
字典对象进行序列化时,必须指定参数safe为False,否则会出现TypeError的错误
"""
通过上述示例我们可以发现,在使用JsonResponse
对数据进行序列化之前,我们需要先手动将queryset
查询集对象转换为列表或者字典,那有没有什么方法或者工具能帮我们自动完成这个过程呢?
在Django中,我们可以使用第三方库bpmappers
来协助我们将queryset
查询集转换成字典或者列表,有了这个工具,我们就可以改写上面的代码了。
安装bpmappers
pip install bpmappers
编写映射器
我们可以在应用目录下新建一个名为“mappers.py”的py文件来配置映射器
from bpmappers.djangomodel import ModelMapper
这里要导入ModelMapper和我们创建的Subject模型
from poll.models import Subject
class SubjectMapper(ModelMapper):
class Meta:
model = Subject
指定映射器要映射的模型
编写好映射器之后我们就可以对我们的视图函数进行改写了
def show_subjects(request):
queryset = Subject.objects.all()
subjects = []
for subject in queryset:
subjects.append(SubjectMapper(subject).as_dict())
return JsonResponse(subjects, safe=False)
如上述代码所示,我们在mappers.py
中创建的映射器会帮助我们将queryset
查询集中的对象转换成字典,之后我们再将这些字典数据放到列表中,最后利用JsonResponse
进行序列化。这样的方式在针对有很多字段的复杂的表的时候,其效率远远高于手动转换。
上述的这些通过在视图里使用函数来处理前端请求的方式我们把它称为FBV,即基于函数的视图。
然而,Python是一个面向对象的编程语言,如果只用函数来开发,有很多面向对象的优点就错失了(继承、封装、多态)。所以Django在后来加入了CBV。可以让我们用类写视图。这样做的优点主要下面两种:
提高了代码的复用性,可以使用面向对象的技术,比如Mixin(多继承)
可以用不同的函数针对不同的HTTP方法处理,而不是通过很多if判断,提高代码可读性
DRF-Django REST framework
在Django框架中,我们可以使用第三方库djangorestframework
pip install djangorestframework
在安装了第三方库djangorestframework
之后,我们可以在项目目录下创建一个名为“serializers.py”的py文件
然后在这个文件中创建序列化所需要的类
from rest_framework import serializers
from poll.models import Subject
class SubjectSerializer(serializers.ModelSerializer):
class Meta:
model = Subject
fields = ('no', 'name', 'intro', 'isHot')
然后我们再次对视图进行改写
from rest_framework.viewsets import ModelViewSet
from poll.serializers import SubjectSerializer
class SubjectView(ModelViewSet):
queryset = Subject.objects.all()
serializer_class = SubjectSerializer
最后我们在urls中配置路径
from poll.views import SubjectView
urlpatterns = [
path('subjects/', SubjectView.as_view()),
]
完成上述步骤之后我们就可以获得数据接口了。