zoukankan      html  css  js  c++  java
  • 91 rest风格 restful规范 restframework

    -1 : rest规范

    0: 它是基于Django的,帮助我们快速开发符合RESTful规范的接口框架:对rest-framework框架的认识:https://www.cnblogs.com/GGGG-XXXX/articles/9260702.html

    1 :使用restframework的cbv的流程:https://blog.csdn.net/NightCharm/article/details/80405479(restful架构)

    https://www.cnblogs.com/GGGG-XXXX/articles/9675911.html(老师博客)
      1 继承APIview: from rest_framework.views import APIView
      2 先走自己类的as_view方法, 没有走父类APIview的as_view方法, APIview中有as_view方法, 返回csrf_exempt(view), --view = super(APIView,     cls).as_view(**initkwargs)
      3 执行父类的as_view方法, 返回view函数, 执行view函数, 返回self.dispatch
      4 从自己类中找dispatch,没有, 找父类的dispatch方法, 有,执行, request = self.initialize_request(request, *args, **kwargs), 获取到新的request, 进到 initialize_reques放回一个Request类, 旧的request放在_request里.然后走try: 执行相应的get或者post方法.

    2 : APIview和View的区别:
      1 APIview重写了as_view和dispatch方法
      2 在dispatch中重新封装了request, :
        新的request: Request()
        旧的request: _request
      3 get请求的数据:
        request.query_params, 在Request类中可以看到(源码)
      4 post请求的数据:
        request.data
    3 : django的序列化:
      第一版: 用values以及JsonResponse实现:
        注意:
          1: 使用json.dumps时加上ensure_ascil不会出现乱码
            res = json.dumps(ret, ensure_ascii=False)
          2: 使用JsonResponse可以序列化时间类型, 如果不是字典, 加上safe= false
            return HttpResponse(JsonResponse(ret, safe=False, json_dumps_params={"ensure_ascii": False}))

          3: dumps和JsonResponse的区别: dumps继承jsonencode, jsonresponse继承encode类,自定义了一个default类, 可以处理时间类型.
      第二版: 用django的serializes实现的序列化:
        缺点: 不能序列化外键关系, 其次, 表名也会渲染到页面上, 不太好
      第三版: 使用restframework:   restframwork专门处理序列化的组件:serializers组件, 类比于model.
        1 先建一个包, 并注册app
        2 下载rest_framework: pip3 install djangorestframework 并在setting中注册.
        3 创建路由, 走视图函数, 对queryset数据序列化, 借助序列化器, 在包下面创建serializers.py文件,
        4 在py文件中写法:

    from rest_framework import serializers
    
    
    class PublisherSerializer(serializers.Serializer):
        id = serializers.IntegerField()
        title = serializers.CharField(max_length=32)
    
    
    class AuthorSerializer(serializers.Serializer):
        id = serializers.IntegerField()
        name = serializers.CharField(max_length=32)
    
    
    class BookSerializer(serializers.Serializer):
        id = serializers.IntegerField()
        title = serializers.CharField(max_length=32)
        pub_time = serializers.DateField()
        category = serializers.CharField(source='get_category_display')
        publisher = PublisherSerializer()
        authors = AuthorSerializer(many=True)
    View Code

        5 在views的使用, 向声明序列化器,使用序列化器序列化queryset, 把模型对象放入序列化器进行字段匹配,

      匹配上的字段进行序列化, 匹配不上的舍弃. 序列化好的数据放在ser_obj.data中,

    from django.shortcuts import render,HttpResponsefrom rest_framework.response import Response #引入Response
    from rest_framework.views import APIView #引入 APIView
    from rest_framework import serializers #用rest_framework自己的serializers
    from django.views import View
    from api_demo.models import *
    
    
    class Bookserializers(serializers.Serializer):
        title=serializers.CharField(max_length=32)
        price=serializers.IntegerField()
    
    class BookView(APIView):#注意这里使用的是APIView不是View
        def get(self,request,*args,**kwargs):
            booklist=Book.objects.all()
            temp=Bookserializers(booklist,many=True)#如果传入的是多个值,由于queryset是多个对象的集合,many=True,默认False
            print(">>>>",temp)
            print("-------",temp.data) #得到的是一种orderDict数据类型的数据
            return Response(temp.data) #必须要用Response发送,发送其中的data就可以
    

      

  • 相关阅读:
    C#入门经典中的SelectionFont属性为null
    C#键盘事件处理
    C# TextBox中的Validating与Validated事件[转]
    System.Diagnostics.Process 执行.EXE
    USB HID usage table
    ADPCM编码和解码
    Load$$ execution region symbols
    Astyle编程语言格式化工具的说明
    RLE行程长度编码压缩算法
    Django文档阅读之执行原始SQL查询
  • 原文地址:https://www.cnblogs.com/gyh412724/p/9960130.html
Copyright © 2011-2022 走看看