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