REST-Framework: 响应器

Rest-Framework之前有篇博客有专门介绍解析器和响应的我们在这里介绍怎么应用Rest-Framewor中的响应器组件,他们的应用并不广泛, 只是在有需求的项目中才会出现,一般用默认的就可以了

一 作用

根据 用户请求URL 或 用户可接受的类型,筛选出合适的 渲染组件。
用户请求URL:
    http://127.0.0.1:8000/test/?format=json
    http://127.0.0.1:8000/test.json

二 内置渲染器

显示json格式:JSONRenderer

访问URL:

  • http://127.0.0.1:8000/test/?format=json

  • http://127.0.0.1:8000/test.json

  • http://127.0.0.1:8000/test/

默认显示格式:BrowsableAPIRenderer(可以修改它的html文件)

访问URL:

  • http://127.0.0.1:8000/test/?format=api

  • http://127.0.0.1:8000/test.api

  • http://127.0.0.1:8000/test/

表格方式:AdminRenderer

访问URL:

  • http://127.0.0.1:8000/test/?format=admin

  • http://127.0.0.1:8000/test.admin

  • http://127.0.0.1:8000/test/

form表单方式:HTMLFormRenderer

访问URL:

  • http://127.0.0.1:8000/test/?format=form

  • http://127.0.0.1:8000/test.form

  • http://127.0.0.1:8000/test/

三 局部使用

from rest_framework.renderers import HTMLFormRenderer,BrowsableAPIRenderer

class BookDetailView(APIView):

renderer_classes = [HTMLFormRenderer,BrowsableAPIRenderer ]

def get(self,request,pk):

book_obj=models.Book.objects.filter(pk=pk).first()

bs=BookSerializers(book_obj,many=False)

return Response(bs.data)

def put(self,request,pk):

book_obj = models.Book.objects.filter(pk=pk).first()



bs=BookSerializers(data=request.data,instance=book_obj)

if bs.is_valid():

bs.save() # update

return Response(bs.data)

else:

return Response(bs.errors)

def delete(self,request,pk):

models.Book.objects.filter(pk=pk).delete()



return Response("")

 

 

四 全局使用

settings里配置:

REST_FRAMEWORK = {

'DEFAULT_RENDERER_CLASSES':['rest_framework.renderers.JSONRenderer']

}

 

 

五 自定义显示模版

from rest_framework.renderers import TemplateHTMLRenderer

class BookDetailView(APIView):

renderer_classes = [TemplateHTMLRenderer]

def get(self,request,pk):

book_obj=models.Book.objects.filter(pk=pk).first()

bs=BookSerializers(book_obj,many=False)

return Response(bs.data,template_name='aa.html')

 

 

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>Title</title>

</head>

<body>

{{ title }}

{{ publishDate }}

</body>

</html>

 封装response对象

1 以后都使用自己封装的response
class APIResponse(Response):
    def __init__(self, code=100, msg='成功', data=None, status=None, headers=None, content_type=None, **kwargs):
        dic = {'code': code, 'msg': msg}
        if data:
            dic['data'] = data

        dic.update(kwargs) # 这里使用update
        super().__init__(data=dic, status=status,
                         template_name=None, headers=headers,
                         exception=False, content_type=content_type)
2 使用:
    return APIResponse(code=100,msg='查询成功',data=ser.data,count=200,next='http://wwwa.asdfas')
View Code

 

 

posted @ 2020-11-13 15:32  Οo白麒麟оΟ  阅读(97)  评论(0编辑  收藏  举报