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就可以

  

posted @ 2018-11-14 20:18  ...绿茵  阅读(223)  评论(0编辑  收藏  举报
1