Acquaintance drf

Acquaintance drf

1. What is restful specification

```

-是一套规则,用于程序之间进行数据交换的规定,
-建议用https协议代替HTTP协议,加密数据,保证数据传输的安全

-在url中体现API,就是在域名后面加上API标识,表名这是一个接口

-在url中提现版本,在API后面加上版本信息,也可以把版本信息放在请求头中,
-方便在项目开发的过程中进行功能的添加和优化时,更好的管理

-restful规范又称为是面向资源的编程,视网络上的一切都是资源,对资源可以进行操 
-作,所以资源一般用名词

-如果要加入一些筛选条件,可以在添加在url中,方便对数据的过滤与筛选

-根据请求方式method的不同,

-返回给用户状态码,来判断请求的状态,以处理相应的请求,比如在状态码是以4开头
-时,应该捕捉相应错误并返回错误信息,也可以自己自定义code状态码

- 返回结果,针对不同的操作,服务器向用户返回不同得到结果
        '''
    -GET/collection:返回资源对象的列表
    -GET/collection/resource:返回单个资源对象
    -POST/collection:返回新生成的资源对象
    -PUT/collection/resource:返回完整的资源对象
    -PATCH/collection/resource:返回完整的资源对象
    -DELETE/collection/resource:返回一个空文档
        '''

-操作异常时,要返回错误信息

-对于下一个请求,要返回一些接口:


-多应用在:前后端分离,APP开发,程序之间,与编程语言无关

```

2. What is drf

```
drf是一个基于Django开发的组件,本质是一个Django的app
drf可以帮我们快速的开发出一个遵循restful规范的程序
```

drf is how to help our rapid development, which provides the functionality

```
-视图:继承了APIview类,

-版本处理

-认证

-权限

-节流--频率限制


-解析器:根据用户请求体格式不同进行数据解析,解析之后放在request.data中
    在进行解析时候,drf会读取HTTP请求头content—type
    如果content-type= x-www-urlencoded,那个drf会根据&符号分隔的形式去处理请求体:user=david&age=19
    如果content-type=application/json,那么drf会根据json形式去处理请求体数据: {"user":david, "age":19}
    
-筛选器

-分页

-序列化:可以对Queryset进行序列化,也可以对用户提交的数据进行校验


-渲染器:可以帮助我们把json数据渲染到页面上进行更好的展示


可以根据Django的生命周期去思考问题
```

Serialization show special data

```
depth:范围是1-10,展示所有外键关联的数据
source:无序加括号,在源码内部会判断是否可执行,如果可执行,自动加括号【ForeignKey/choices】
serializermethodfield:定义钩子方法

```

drf simple application

installation

```
pip3 install djangorestframework
```

url

```
from django.conf.urls import url
from django.contrib import admin
from API import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^new/article/$', views.NewArticleView.as_view(),),
    url(r'^new/article/(?P<pk>\d+)/$', views.NewArticleView.as_view(),),
```

Field treatment

from rest_framework import serializers
from API import models


class ArticleSerializers(serializers.ModelSerializer):

    # 特殊字段处理
    category_name = serializers.CharField(source='category.name', required=False)
    status_display = serializers.CharField(source='get_status_display', required=False)
    tag = serializers.SerializerMethodField()

    class Meta:
        model = models.Article
        fields = ['id', 'title', 'summary', 'content', 'category', 'category_name', 'tag', 'status', 'status_display', ]
        # depth 方法
        # depth = 2
        
        
    #钩子方法
    def get_tag(self, obj):
        return [row for row in obj.tag.all().values("id", "label")]

class NewArticleSerializers(serializers.ModelSerializer):
    class Meta:
        model = models.Article
        fields = '__all__'

View of the business process: CRUD

```
from rest_framework.response import Response
from rest_framework.views import APIView
from API import models, serializer
```

```
class NewArticleView(APIView):

    def get(self, request, *arge, **kwargs):
        pk = kwargs.get("pk")
        if not pk:
            queryset = models.Article.objects.all()
            ser = serializer.ArticleSerializers(instance=queryset, many=True)
            return Response(ser.data)
        queryset = models.Article.objects.filter(pk=pk).first()
        ser = serializer.ArticleSerializers(instance=queryset, many=False)
        return Response(ser.data)
        pass

  def post(self, request, *arge, **kwargs):
        ser = serializer.NewArticleSerializers(data=request.data)
        if ser.is_valid():
            ser.save()
            return Response(ser.data)
        return Response(ser.errors)

        pass

  def put(self, request, *arge, **kwargs):
            pk = kwargs.get("pk")
            article_obj = models.Article.objects.filter(id=pk).first()
            ser = serializer.NewArticleSerializers(data=request.data, instance=article_obj)
            if ser.is_valid():
                ser.save()
                return Response(ser.data)
            return Response(ser.errors)
            pass

  def patch(self, request, *args, **kwargs):
        pk = kwargs.get("pk")
        article_obj = models.Article.objects.filter(pk=pk).first()
        ser = serializer.NewArticleSerializers(instance=article_obj, data=request.data, partial=True)
        if ser.is_valid():
            ser.save()
            return Response(ser.data)
        return Response(ser.errors)

  def delete(self, request, *arge, **kwargs):
        pk = kwargs.get("pk")
        models.Article.objects.filter(id=pk).delete()
        return Response("删除成功")
        pass

```

Guess you like

Origin www.cnblogs.com/daviddd/p/11918361.html