Django REST framework - 响应格式和请求格式配置、解析器、自动生成路由、action装饰器
drf响应格式和请求格式配置(了解)
配置响应格式
1 在配置文件中配置
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': ( # 默认响应渲染类
'rest_framework.renderers.JSONRenderer', # json渲染器
'rest_framework.renderers.BrowsableAPIRenderer', # 浏览API渲染器
)
}
2 在浏览器访问就是浏览器方式,用postman访问就是json格式,ajax请求就是json格式
3 原来没有配置,为什么显示浏览器方式和json的样子
4 drf也有一套默认配置文件,默认就配了两个响应类
5 局部配置某个视图类的响应格式,在视图类中配置
from rest_framework.renderers import renderer
renderer_classes = [JSONRenderer]
配置能够解析的格式(urlencoded,formdata,json)
1 在setting中配置
REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES': [
# 解析json格式数据({"user": "zhubao"}),解析成功后,request.data类型为dict
'rest_framework.parsers.JSONParser',
# 解析form表单格式数据(user=zhubao),解析成功后,request.data类型为QuerySet
'rest_framework.parsers.FormParser',
# (用的较少),解析较为复杂的form表单格式数据,解析成功后,request.data类型为QuerySet
'rest_framework.parsers.MultiPartParser'
]
}
2 它就只能解析三种请求编码格式(urlencoded,formdata,json)
3 局部使用,在视图类中配置
from rest_framework.parsers import FormParser
parser_classes = [FormParser,JSONParser]
封装自己的Response对象
from rest_framework.response import Response
class APIResponse(Response):
def __init__(self, code=200, msg=None, data=None, status=None,
template_name=None, headers=None,
exception=False, content_type=None, **kwargs):
dic = {'status': code, 'msg': msg}
if data:
dic['data'] = data
if kwargs:
dic.update(kwargs)
super().__init__(data=dic, status=status,
template_name=template_name, headers=headers,
exception=exception, content_type=content_type)
### 使用,在视图类中
return APIResponse(msg='成功了',data=ser.data)
drf自动生成路由
1 三种路由写法
- path('test/', views.Test.as_view()),
- path('test/', views.Test.as_view({'get':'send_email'})),
- 自动生成路由
# 1 导入路由类
from rest_framework.routers import SimpleRouter, DefaultRouter
# DefaultRouter生成的路由更多一点,多了一个根的路由(没有用)
# 2 实例化得到对象
router = SimpleRouter()
# 3 注册路由
router.register('books', views.BookView)
router.register('publish', views.PublishView)
# print(router.urls) # 自动生成的路由
urlpatterns = [
# 把自动生成的路径加入到urlpatterns
path('api/v1/', include(router.urls)),
]
# 4 把自动生成的路径加入到urlpatterns
urlpatterns+=router.urls
总结:ViewSetMixin+9个视图子类才能用自动生成路由
action装饰器
在视图集中,如果想要让Router自动帮助我们为自定义的动作生成路由信息,需要使用rest_framework.decorators.action装饰器。
以action装饰器装饰的方法名会作为action动作名,与list、retrieve等同。
1 作用:给自动生成路由的视图类再定制一些路由
2 用法一:
# api/v1/publish/sen_email/
@action(methods=['GET'], detail=False)
def sen_email(self, request, *args, **kwargs):
print(args)
print(kwargs)
return APIResponse(msg='发送成功')
3 方法二:
# api/v1/publish/10/sen_email/
@action(methods=['GET'], detail=True)
def sen_email(self, request, *args, **kwargs):
# pk=10
print(args)
print(kwargs)
return APIResponse(msg='发送成功')
回顾总结
1 drf入门
-web开发模式:分离和混合
-api接口:接口
-postman的使用(http客户端)
-restful-10条规范
-drf是什么,能做什么(快速写符合resful规范的接口)
-分析了执行流程:APIView
-重写了dispatch
-包装了新的request:drf的request
-self.initial
-请求格式处理,认证,权限,频率
-处理了全局异常
-处理了响应
-Request对象:data,取其他值和属性时跟原来一样
2 序列化器
-Serializer,ModelSerializer
-写一个类继承Serializer
-在类中写字段,
-字段参数:read_only,write_only
-视图类中使用:ser=Serilaizer(要序列化的对象,many=True)
-ser.data
-反序列化
-ser=Serilaizer(data=字典)
-ser.is_valid()
-ser.save():Serializer需要重写update和create
-反序列化的修改
-ser=Serilaizer(instance=对象,data=字典)
-ModelSerializer
-class Meta:
model=表模型
fields='__all__'
extra_kwargs={'name';{}}
-重写字段
name=serilaizer.CharField(source='xx')
name=serilaizer.SerializerMethodField()
def get_name(self,obj):
return 'sb'+obj.name
子序列化
publish=PublishSerializer()
2.1 序列化类的源码
-many控制了谁
-局部钩子和全局钩子
-source为什么填publish.name 方法
3 请求和响应
-自己封装了一个响应对象(low,高级)
-通过配置,配置请求和响应(全局配置,局部配置)
4 视图
-APIView,GenericAPIView
-5个视图扩展类
-9个视图子类
-写一个删除接口(只需要继承DestroyAPIView,写上那两个类属性)
-视图集
-ViewSetMixin:路由就不一样了
4.1 写一个删除接口,但是,删除后要记录日志
5 自动生成路由
-SimpleRouter
-ViewSetMixin+9个子类视图才能自动生成路由
6 action装饰器
-自动生成路由后,使用action装饰器来继续让写在视图类的方法,可以被访问到

浙公网安备 33010602011771号