django-rest-framework是基于django框架封装的一层更高级的框架,非常适合做后台接口,这里主要说一下请求的传递,看rest框架是如何让我们的代码写的更方便。
安装配置前文已经讲过,这里不再重复。请求的部分这里主要说两个方式。
传统的django请求方式是要根据request.method 的方法名进行判断是get还是post等,但是在这里就不需要了,rest框架已经量身定制好了。
第一种使用http action进行对应的函数名进行处理,内容处理逻辑全部自己处理,附上各种方式获取的请求参数:
上views代码
-
from rest_framework.views import APIView #导入API类
-
-
class rest(APIView):
-
#请求get方法就由此函数处理
-
def get(self, request):
-
#输出请求的数据
-
print request.query_params
-
#以json格式返回
-
return JsonResponse(request.query_params)
-
-
#请求post方法由此函数处理
-
def post(self, request):
-
#输出请求数据
-
print request.data
-
return JsonResponse(request.data)
上url代码,view调用方式
-
from views.import rest
-
-
#将url跟view对应
-
urlpatterns += [
url(r"test", rest.as_view()),
-
]
-
第二种常用于跟数据库交互。基本流程为 view <-->
serializers <--> model <--> ORM <--> mysql(或者别的数据)
views.py view函数为对机器信息表的增删查改 根据设置每页展示数据,如无特殊需求可直接继承使用
ModelViewSet,使用序列化为 get_serializer_class
-
from rest_framework.filters import SearchFilter
-
from rest_framework.authentication import TokenAuthentication
-
import django_filters
-
from rest_framework.permissions import IsAuthenticated
-
-
class CmdbMachineInfoViewSet(viewsets.ModelViewSet, cmdb_machine_info.Utils):
-
# 定义检索的后端驱动
-
filter_backends = (django_filters.rest_framework.DjangoFilterBackend, SearchFilter)
-
# 定义检索的表中字段, 其中project__id为外键索引
-
filter_fields = ('status', 'project__id','account')
-
# 定义搜索的字段 在http中通过增加search参数,可以查询设置字段中的值
-
search_fields = ('id','hostname','id')
-
# 设置接口使用认证方式,主要有token,session,用户名密码登录等方式
-
# authentication_classes = (TokenAuthentication,)
-
# 设置认证用户是否有权限访问
-
# permission_classes = (IsAuthenticated, )
-
-
-
def get_serializer_class(self):
-
return self.get_serializer_list()
-
-
def get_queryset(self): # 定义所需list返回的列表,并定义每页所需展示的数据
-
page_size = 15
-
if self.request.GET.get('page_size'):
-
page_size = self.request.GET.get('page_size')
-
self.pagination_class.page_size = page_size
-
return self.get_model().objects.all()
-
-
#返回全部表数据,根据设置每页展示数据,如无特殊需求可直接继承使用 ModelViewSet
-
# def list(self, request, *args, **kwargs):
-
# queryset = self.filter_queryset(self.get_queryset())
-
# page = self.paginate_queryset(queryset)
-
# if page is not None:
-
# serializer = self.get_serializer(page, many=True)
-
# return self.get_paginated_response(serializer.data)
-
# serializer = self.get_serializer(queryset, many=True)
-
# return Response(serializer.data)
-
-
# def retrieve(self, request, *args, **kwargs): # 使用自定义序列化返回数据
-
# self.serializer_class = self.get_serializer_retrieve()
-
# return super(CmdbMachineInfoViewSet, self).retrieve(self, request, *args, **kwargs)
-
# return viewsets.ModelViewSet.retrieve(self, request, *args, **kwargs)
-
-
def create(self, request, *args, **kwargs): #使用自定义序列化创建数据
-
retdict = self.save_utils("create", request.data)
-
if 'instance' in retdict: retdict.pop('instance')
-
return JsonResponse(retdict, status=200)
-
-
def update(self, request, *args, **kwargs): # 使用自定义序列化更新数据
-
instance = self.get_object() #获取当前数据实例,为当前数据记录
-
retdict = self.save_utils("update", request.data, instance=instance)
-
if 'instance' in retdict: retdict.pop('instance')
-
return JsonResponse(retdict, status=200)
url 调用
-
from rest_framework import routers #使用默认路由模式
-
-
router = routers.DefaultRouter()
-
router.register(r'machineinfo', CmdbMachineInfoViewSet, base_name='cmdb_machine_info') #调用view函数
以上介绍两种rest framework 框架常用的两种view模式, 如需有数据库操作则推荐使用ModelViewSet或ReadOnlyModelViewSet 或者自定义权限。
阅读(7225) | 评论(0) | 转发(0) |