初识drf

初识drf

1,什么是restful规范

```

-是一套规则,用于程序之间进行数据交换的规定,
-建议用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,什么是drf

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

drf是如何帮我们快速开发的,提供了哪些功能

```
-视图:继承了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的生命周期去思考问题
```

序列化,展示特殊的数据

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

```

drf简单应用

安装

```
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(),),
```

字段 处理

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__'

视图业务处理:增删改查

```
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

```
posted @ 2019-11-23 15:57  阿浪阿浪  阅读(251)  评论(0编辑  收藏  举报