个人宽带 架设网站需备案,wordpress怎么制作响应式,购物网站后台流程图,深圳东门步行街地铁站首
前后端分离是互联网应用开发的标准使用方式#xff0c;让前后端通过接口实现解耦#xff0c;能够更好的进行开发和维护。
RESTful接口常见规范
在接口设计中#xff0c;大家遵循一定的规范可以减少很多不必要的麻烦#xff0c;例如url应有一定辨识度#xff0c;可以…
首
前后端分离是互联网应用开发的标准使用方式让前后端通过接口实现解耦能够更好的进行开发和维护。
RESTful接口常见规范
在接口设计中大家遵循一定的规范可以减少很多不必要的麻烦例如url应有一定辨识度可以加入api等关键词路径中尽量不要含有动词根据请求方式对业务逻辑进行划分等等如
请求方式数据库操作描述GETSELECT获取数据POSTCREATE添加数据PUTUPDATE更新数据DELETEDELETE删除数据
DRF安装
安装命令
pip install djangorestframework
settings.py注册
INSTALLED_APPS [rest_framework,...
]
视图编写
app/views.py
from rest_framework.views import APIView
from rest_framework.response import Responseclass IndexView(APIView):def get(self, request):res dict()res[mes] successres[data] 123return Response(res)
视图函数变成了视图类需要继承APIView。可在类内部分别定义getpost等请求函数视图会根据请求方式映射不同处理函数。
路由配置
每条路由对应一个视图函数故需将视图类转为视图函数
urls.py
from django.contrib import admin
from django.urls import path
from app1 import viewsurlpatterns [path(admin/, admin.site.urls),path(index/, views.IndexView.as_view()),
]
访问指定路由后 DRF框架自带的接口界面很好看也便于调试。
序列化操作
将数据库数据整理为接口返回数据的过程很繁琐DRF简化了序列化操作。
定义model/app/models.py
from django.db import models# Create your models here.
class Player(models.Model):id models.AutoField(primary_keyTrue)name models.CharField(max_length20)
定义了player模型两个字段id和name。为了方便后台操作我们将其进行admin注册app/admin.py
from django.contrib import admin
from app.models import Player
# Register your models here.admin.site.register(Player)
记得进行数据迁移之后便可在admin管理界面看到Player表格登录admin管理系统需要创建用户创建命令
python manage.py createsuperuser
按提示注册后登录admin管理界面 可以看到创建的表格手动添加两条数据。如果我们希望返回所有player信息视图应该这么写app/views.py:
from rest_framework.views import APIView
from rest_framework.response import Response
from app1.models import Playerclass PlayersView(APIView):def get(self, request):players Player.objects.all()res list()for p in players:t dict()t[id] p.idt[name] p.nameres.append(t)return Response(res) 字段较少的时候无妨字段太多的时候这是个让人抓狂的操作。
可以先编写一个序列化类app/serializer.py:
from rest_framework import serializers
from app1.models import Playerclass PlayersModelSerializer(serializers.ModelSerializer):class Meta:modelPlayer# fields__all__fields (id, name)
此类用于对Player进行序列化Meta类中只需指明指定模型以及想要序列化的字段即可fields的all参数指所有字段。
视图修改app/views.py:
from rest_framework.views import APIView
from rest_framework.response import Response
from app1.models import Player
from app1.serializers import PlayersModelSerializerclass PlayersView(APIView):def get(self, request):players Player.objects.all()# 创建序列化对象many指多条数据players_json PlayersModelSerializer(players, manyTrue)print(players_json.data)# data返回序列化后的数据return Response(players_json.data)
设置路由后访问结果 ModelSerializer只是对模型进行序列化如果对其以外复杂结构进行序列化可以继承Serializer类逐个字段进行手动编写以及序列化嵌套等等不在赘述。
Mixins类改进
Django的mixins实现了各种功能让其他函数继承能够让用户用更少的代码操作模型一般会配合GenericAPIView使用Mixin有五类
类描述请求方法ListModelMixin返回查询集列表提供list方法GETCreateModelMixin创建实例提供create()方法POSTRetrieveModelMixin返回一个具体实例提供retrieve()方法GETUpdateModelMixin更新实例提供update()方法PUT、PATCHDestoryModelMixin删除实例提供delete()方法DELETE
同样实现上面返回player列表的功能视图可以这样写app/views.py
from rest_framework import mixins, generics
from app1.models import Player
from app1.serializers import PlayersModelSerializerclass PlayersView(mixins.ListModelMixin, generics.GenericAPIView):queryset Player.objects.all()serializer_class PlayersModelSerializerdef get(self, request):return self.list(request)
queryset和serializer_class是要操作的数据集合序列化类GenericAPIView需要的参数。因为ListModelMixin提供了list函数get请求视图的返回结果可以直接调用。这里的执行结果与上面相同。(如果queryset需要条件查询需要重写get_queryset函数。
如果是添加数据则
from rest_framework import mixins, generics
from app1.models import Player
from app1.serializers import PlayersModelSerializerclass PlayersView(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):queryset Player.objects.all()serializer_class PlayersModelSerializerdef get(self, request):return self.list(request)def post(self, request):return self.create(request) 提供name参数即可添加成功。
另外三个Mixin类使用相同因为要对指定数据进行修改故需提供词条数据的pk主键来找到此条数据。app/views.py)
class PlayerDetailView(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin,generics.GenericAPIView):queryset Player.objects.all()serializer_class PlayersModelSerializerdef get(self, request, *args, **kwargs):return self.retrieve(request, *args, **kwargs)def put(self, request, *args, **kwargs):return self.update(request, *args, **kwargs)def delete(self, request, *args, **kwargs):return self.destroy(request, *args, **kwargs)
路由需要提供pk参数urls.py)
urlpatterns [path(players/int:pk/, views.PlayerDetailView.as_view()),...
]如果想要通过其他字段查找数据需要提供lookup_field参数指明要查找的字段查询结果多于一条时会报错
class PlayerDetailView(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin,generics.GenericAPIView):queryset Player.objects.all()serializer_class PlayersModelSerializerlookup_field namedef get(self, request, *args, **kwargs):return self.retrieve(request, *args, **kwargs)def put(self, request, *args, **kwargs):return self.update(request, *args, **kwargs)def delete(self, request, *args, **kwargs):return self.destroy(request, *args, **kwargs)
urlpatterns [path(players/name/, views.PlayerDetailView.as_view()),...
] GenericAPIView类
GenericAPIView还有许多子类直接将Mixins和GenericAPIView进行了组合有这么多
类提供方法 CreateAPIView postListAPIViewgetRetrieveAPIViewgetDestroyAPIViewdeleteUpdateAPIViewput, patchListCreateAPIViewget, postRetrieveUpdateAPIViewget, put, patchRetrieveDestroyAPIViewget, delete, patchRetrieveUpdateDestroyAPIViewget, put, delete, patch 上面的试图类可以这么写
class PlayerDetailView(generics.RetrieveUpdateDestroyAPIView):queryset Player.objects.all()serializer_class PlayersModelSerializerlookup_field name
言简意赅。
自定义返回数据
DRF提供了自定义返回类可以自己编写也可以硬往里赛东西比如
def get(self, request, *args, **kwargs):res dict()res[mes] successres[data] self.list(request, *args, **kwargs).datareturn Response(res)
把原来Response中的data取出来重新塞点东西再返回。 分页 DRF有三个分页方式这里说一个PageNumberPagination创建一个分页类app/paginations.py
from rest_framework.pagination import PageNumberPaginationclass PlayerPagination(PageNumberPagination):page_size 2 # 每页显示的数据数量max_page_size 4 # 每页最多显示的数据数量page_size_query_param size # 显示数量的变量名page_query_param page # 页数的变量名如果访问localhost/player/?page2size3则会返回以三条数据分页的第二页内容
用户视图app/views.py:
from rest_framework import mixins, generics
from app1.models import Player
from app1.serializers import PlayersModelSerializer
from app1.paginations import PlayerPaginationclass PlayersView(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):queryset Player.objects.all()serializer_class PlayersModelSerializerpagination_class PlayerPaginationdef get(self, request, *args, **kwargs):return self.list(request, *args, **kwargs) 尾
一般APIView配合序列化就能很好开发接口Mixins和GenericAPIView少不了几行代码且queryset和response部分限制较多自定义覆盖原方法的代码也就差不多把少的几行代码补回了如果需要分页功能可以用GenericAPIView编写。