drf04 请求响应
1 请求和响应
1.1 请求 request
# 请求对象
# from rest_framework.request import Request
def __init__(self, request, parsers=None, authenticators=None,
negotiator=None, parser_context=None):
# 二次封装request,将原生request作为drf request对象的 _request 属性
self._request = request
def __getattr__(self,item):
return getattr(self._request,item)
# 请求对象.data:前端以三种编码方式传入的数据,都可以取出来
# 请求对象..query_params 与Django标准的request.GET相同,只是更换了更正确的名称而已。
1.2 响应 response
#from rest_framework.response import Response
def __init__(self, data=None, status=None,
template_name=None, headers=None,
exception=False, content_type=None):
#data:你要返回的数据,字典
#status:返回的状态码,默认是200,
-from rest_framework import status在这个路径下,它把所有使用到的状态码都定义成了常量
#template_name 渲染的模板名字(自定制模板),不需要了解
#headers:响应头,可以往响应头放东西,就是一个字典
#content_type:响应的编码格式,application/json和text/html;
# 浏览器响应成浏览器的格式,postman响应成json格式,通过配置实现的(默认配置)
#不管是postman还是浏览器,都返回json格式数据
# drf有默认的配置文件---》先从项目的setting中找,找不到,采用默认的
# drf的配置信息,先从自己类中找--》项目的setting中找---》默认的找
-局部使用:对某个视图类有效
-在视图类中写如下
from rest_framework.renderers import JSONRenderer
renderer_classes=[JSONRenderer,]
-全局使用:全局的视图类,所有请求,都有效
from rest_framework import settings # drf 默认配置
-在setting.py中加入如下
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': ( # 默认响应渲染类
'rest_framework.renderers.JSONRenderer', # json渲染器
'rest_framework.renderers.BrowsableAPIRenderer', # 浏览API渲染器
)
}
1.2.1 状态码
from rest_framework import status # 点击进去找,或者直接导入后调用
1.2.2 案例 - 设置响应方式
前期准备
# models.py
from django.db import models
class Book(models.Model):
name=models.CharField(max_length=32)
price=models.DecimalField(max_digits=5,decimal_places=2)
# ser.py
from rest_framework import serializers
from app03_views import models
class BookSerializers(serializers.ModelSerializer):
class Meta:
model = models.Book
fields = '__all__'
extra_kwargs ={
'id':{'read_only':True}
}
# urs.py
from django.urls import path, re_path
from app03_views import views
urlpatterns = [
# serializser
# 增、删、改、查
path('books/', views.BooksAPIView.as_view()),
re_path(r'^books/(?P<pk>\d+)/', views.BookAPIView.as_view()),
]
配置全局
在项目的settings中配置全局
#这个变量REST_FRAMEWORK,里面都是drf的配置信息
from rest_framework import settings
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': ( # 默认响应渲染类
'rest_framework.renderers.JSONRenderer', # json渲染器
'rest_framework.renderers.BrowsableAPIRenderer', # 浏览API渲染器
),
}
配置局部
在视图类中配置
from rest_framework.views import APIView
from rest_framework.response import Response
from app03_views.ser import BookSerializers, PublishSerializers
from app03_views import models
# response 相关
# 用来配置response的返回方式
from rest_framework.renderers import JSONRenderer
from rest_framework.renderers import BrowsableAPIRenderer
# 用来获取状态码
from rest_framework import status
# 配置了局部,全局的就没有效果了,配置了JSONRenderer
class BooksAPIView(APIView):
renderer_classes = [JSONRenderer, ]
def get(self, request):
obj = models.Book.objects.all()
ser = BookSerializers(instance=obj, many=True)
if obj:
return Response(ser.data)
else:
return Response(ser.errors)
def post(self, request):
ser = BookSerializers(data=request.data)
if ser.is_valid():
ser.save()
return Response(ser.data)
else:
return Response(ser.errors)
# 配置了局部,全局的就没有效果了,配置了BrowsableAPIRenderer
class BookAPIView(APIView):
renderer_classes = [BrowsableAPIRenderer,]
def get(self, request, pk):
print('get-pk')
obj = models.Book.objects.filter(pk=pk).first()
ser = BookSerializers(instance=obj, )
if obj:
return Response(ser.data)
else:
return Response(ser.errors)
def put(self, request, pk):
print('put-pk')
obj = models.Book.objects.filter(pk=pk).first()
ser = BookSerializers(instance=obj, data=request.data)
if ser.is_valid():
ser.save()
return Response(ser.data)
else:
return Response(ser.errors)
def delete(self, request, pk):
print('delete-pk')
obj = models.Book.objects.filter(pk=pk)
if obj:
obj.delete()
return Response(status=status.HTTP_200_OK)
else:
return Response(status=status.HTTP_406_NOT_ACCEPTABLE)

浙公网安备 33010602011771号