Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1238156
  • 博文数量: 62
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 636
  • 用 户 组: 普通用户
  • 注册时间: 2015-05-26 18:02
个人简介

祸兮福之所倚,福兮祸之所伏

文章分类

全部博文(62)

文章存档

2020年(9)

2019年(10)

2017年(10)

2016年(25)

2015年(7)

我的朋友

分类: Python/Ruby

2020-06-22 17:07:26

     django-rest-framework是基于django框架封装的一层更高级的框架,非常适合做后台接口,这里主要说一下请求的传递,看rest框架是如何让我们的代码写的更方便。
    安装配置前文已经讲过,这里不再重复。请求的部分这里主要说两个方式。
     传统的django请求方式是要根据request.method 的方法名进行判断是get还是post等,但是在这里就不需要了,rest框架已经量身定制好了。
   第一种使用http action进行对应的函数名进行处理,内容处理逻辑全部自己处理,附上各种方式获取的请求参数:
    上views代码

点击(此处)折叠或打开

  1. from rest_framework.views import APIView #导入API类

  2. class rest(APIView):
  3.        #请求get方法就由此函数处理
  4.        def get(self, request):
  5.               #输出请求的数据
  6.               print request.query_params
  7.               #以json格式返回
  8.               return JsonResponse(request.query_params)
  9.        
  10.        #请求post方法由此函数处理
  11.        def post(self, request):
  12.               #输出请求数据
  13.               print request.data
  14.               return JsonResponse(request.data)
    上url代码,view调用方式
  

点击(此处)折叠或打开

  1. from views.import rest

  2. #将url跟view对应
  3. urlpatterns += [
      url(r"test", rest.as_view()),
  4. ]
        
    
    第二种常用于跟数据库交互。基本流程为  view <--> serializers <--> model <--> ORM <--> mysql(或者别的数据)
    views.py  view函数为对机器信息表的增删查改  
根据设置每页展示数据,如无特殊需求可直接继承使用 ModelViewSet,使用序列化为 get_serializer_class

    

点击(此处)折叠或打开

  1. from rest_framework.filters import SearchFilter
  2. from rest_framework.authentication import TokenAuthentication 
  3. import django_filters
  4. from rest_framework.permissions import IsAuthenticated
  5. 
    			
  6. class CmdbMachineInfoViewSet(viewsets.ModelViewSet, cmdb_machine_info.Utils):  
  7.     # 定义检索的后端驱动             
  8.     filter_backends = (django_filters.rest_framework.DjangoFilterBackend, SearchFilter)  
  9.     # 定义检索的表中字段, 其中project__id为外键索引         
  10.     filter_fields = ('status', 'project__id','account'
  11.     # 定义搜索的字段 在http中通过增加search参数,可以查询设置字段中的值                  
  12.     search_fields = ('id','hostname','id')      
  13.     # 设置接口使用认证方式,主要有token,session,用户名密码登录等方式         
  14.     # authentication_classes = (TokenAuthentication,)   
  15.     # 设置认证用户是否有权限访问                                         
  16.     # permission_classes = (IsAuthenticated, )      

  17.     
  18.     def get_serializer_class(self):     
  19.         return self.get_serializer_list()

  20.     def get_queryset(self):             # 定义所需list返回的列表,并定义每页所需展示的数据
  21.         page_size = 15
  22.         if self.request.GET.get('page_size'):
  23.             page_size = self.request.GET.get('page_size')
  24.         self.pagination_class.page_size = page_size
  25.         return self.get_model().objects.all()

  26.     #返回全部表数据,根据设置每页展示数据,如无特殊需求可直接继承使用 ModelViewSet
  27.     # def list(self, request, *args, **kwargs):      
  28.         # queryset = self.filter_queryset(self.get_queryset())         
  29.         # page = self.paginate_queryset(queryset)
  30.         # if page is not None:
  31.             # serializer = self.get_serializer(page, many=True)        
  32.             # return self.get_paginated_response(serializer.data)
  33.         # serializer = self.get_serializer(queryset, many=True)
  34.         # return Response(serializer.data)
  35.         
  36.     # def retrieve(self, request, *args, **kwargs):          # 使用自定义序列化返回数据
  37.         # self.serializer_class = self.get_serializer_retrieve()
  38.         # return super(CmdbMachineInfoViewSet, self).retrieve(self, request, *args, **kwargs)
  39.         # return viewsets.ModelViewSet.retrieve(self, request, *args, **kwargs)

  40.     def create(self, request, *args, **kwargs):             #使用自定义序列化创建数据
  41.         retdict = self.save_utils("create", request.data)
  42.         if 'instance' in retdict: retdict.pop('instance')
  43.         return JsonResponse(retdict, status=200)
  44.     
  45.     def update(self, request, *args, **kwargs):           # 使用自定义序列化更新数据
  46.         instance = self.get_object()                     #获取当前数据实例,为当前数据记录
  47.         retdict = self.save_utils("update", request.data, instance=instance)        
  48.         if 'instance' in retdict: retdict.pop('instance')
  49.         return JsonResponse(retdict, status=200)
    url 调用
    

点击(此处)折叠或打开

  1. from rest_framework import routers                    #使用默认路由模式

  2. router = routers.DefaultRouter()
  3. router.register(r'machineinfo', CmdbMachineInfoViewSet, base_name='cmdb_machine_info')         #调用view函数
    以上介绍两种rest framework 框架常用的两种view模式, 如需有数据库操作则推荐使用ModelViewSet
ReadOnlyModelViewSet 或者自定义权限。


      


       

    
      
阅读(1581) | 评论(0) | 转发(0) |
0

上一篇:Vue组件之间通信

下一篇:将博客搬至CSDN

给主人留下些什么吧!~~