请求和响应
目录
请求和响应
请求request
常用属性:request.data,前端三种编码方式传过来都可以取出来
request.query_params和request.GET的属性一样。这个是二次封装后的属性
响应response
REST framework提供了一个响应类Response
,使用该类构造响应对象时,响应的具体数据内容会被转换(render渲染)成符合前端需求的类型。
REST framework提供了Renderer
渲染器,用来根据请求头中的Accept
(接收数据类型声明)来自动转换响应数据到对应格式。如果前端请求中未进行Accept声明,则会采用默认方式处理响应数据,我们可以通过配置来修改默认响应格式。
可以在rest_framework.settings查找所有的drf默认配置项:
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': ( # 默认响应渲染类
'rest_framework.renderers.JSONRenderer', # json渲染器
'rest_framework.renderers.BrowsableAPIRenderer', # 浏览API渲染器
)
}
# 在视图类中
局部使用:from rest_framework.renderers import JSONRenderer
renderer_classes=[JSONRenderer,]
-全局使用:全局的视图类,所有请求,都有效
-在setting.py中加入如下
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': ( # 默认响应渲染类
'rest_framework.renderers.JSONRenderer', # json渲染器
'rest_framework.renderers.BrowsableAPIRenderer', # 浏览API渲染器
)
}
常用属性
data: 返回的数据,是一个字典
status:返回的状态码,默认是200
tempalte_name:渲染的模板
headers:响应头
content_type: 响应的编码格式,application/json/text
视图
基于APIView写的接口
class BookAPIView(APIView):
def get(self,request,pk):
book = models.Book.objects.filter(pk=pk).first()
book_ser = ser.BookSerializers(book)
return Response(book_ser.data)
def put(self,request,pk):
response_msg = {'status':100,'msg':""}
book = models.Book.objects.filter(pk=pk).first()
book_ser = ser.BookSerializers(instance=book,data=request.data)
if book_ser.is_valid():
book_ser.save()
else:
response_msg['status'] = 101
response_msg['msg'] = '失败'
response_msg['data'] = request.data
return Response(request.data)
def delete(self,request,pk):
response_msg = {'status': 100, 'msg': ""}
book = models.Book.objects.filter(pk=pk).delete()
return Response(response_msg)
class BookSAPIView(APIView):
def post(self,request):
book = ser.BookSerializers(data=request.data)
if book.is_valid():
book.save()
return Response(book.data)
def get(self, request):
book = models.Book.objects.all()
book_ser = ser.BookSerializers(book,many=True)
return Response(book_ser.data)
基于 GenericAPIView
rom rest_framework.generics import GenericAPIView
class Book2View(GenericAPIView):
queryset = models.Book.objects
serializer_class = ser.BookSerializers
def get(self,request,pk):
book = self.get_object()
book_ser = self.get_serializer(book)
return Response(book_ser.data)
def put(self,request,pk):
book = models.Book.objects.filter(pk=pk).first()
book_ser = ser.BookSerializers(instance=book,data=request.data)
if book_ser.is_valid():
book_ser.save()
return Response(request.data)
def delete(self,request,pk):
response_msg = {'status': 100, 'msg': ""}
models.Book.objects.filter(pk=pk).delete()
return Response(response_msg)
class Books2View(GenericAPIView):
queryset = models.Book.objects
serializer_class = ser.BookSerializers
def get(self, request):
book = self.get_queryset()
book_ser = self.get_serializer(book,many=True)
return Response(book_ser.data)
def post(self,request):
book = self.get_serializer(data=request.data)
if book.is_valid():
book.save()
return Response(book.data)
url:
url(r'^book2/(?P<pk>\d+)/', views.Book2View.as_view()),
url(r'^books2/', views.Books2View.as_view()),
GenericAPIView+5 个视图扩展类
from rest_framework.mixins import ListModelMixin,CreateModelMixin,UpdateModelMixin,DestroyModelMixin,RetrieveModelMixin
class Book3View(GenericAPIView,RetrieveModelMixin,DestroyModelMixin,UpdateModelMixin):
queryset = models.Book.objects
serializer_class = ser.BookSerializers
def get(self,request,pk):
return self.retrieve(request,pk)
def put(self,request,pk):
return self.update(request,pk)
def delete(self,request,pk):
return self.destroy(request,pk)
class Books3View(GenericAPIView,ListModelMixin,CreateModelMixin):
queryset = models.Book.objects
serializer_class = ser.BookSerializers
def get(self, request):
return self.list(request)
def post(self,request):
return self.create(request)
url:
url(r'^book3/(?P<pk>\d+)/', views.Book3View.as_view()),
url(r'^books3/', views.Books3View.as_view()),
使用ModelViewSet编写5个接口
from rest_framework.viewsets import ModelViewSet
class Book4View(ModelViewSet):
queryset = models.Book.objects
serializer_class = ser.BookSerializers
url:
url(r'^book4/(?P<pk>\d+)/', views.Book4View.as_view(actions={'get':'retrieve','post':'update','delete':'destroy'})),
url(r'^books4/', views.Book4View.as_view(actions={'get':'list','post':'create'}))
只要使用了ModelViewSet就要重新配置路由
继承ViewSetMixin的视图类
# views.py
from rest_framework.viewsets import ViewSetMixin
class Book5View(ViewSetMixin,APIView): #一定要放在APIVIew前
def get_all_book(self,request):
book_list = Book.objects.all()
book_ser = BookSerializer(book_list, many=True)
return Response(book_ser.data)
# urls.py
#继承ViewSetMixin的视图类,路由可以改写成这样
url(r'^books5/, views.Book5View.as_view(actions={'get': 'get_all_book'})),
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 《HelloGitHub》第 108 期
· Windows桌面应用自动更新解决方案SharpUpdater5发布
· 我的家庭实验室服务器集群硬件清单
· C# 13 中的新增功能实操
· Supergateway:MCP服务器的远程调试与集成工具