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)


posted @ 2023-05-26 09:01  派森的猫  阅读(8)  评论(0)    收藏  举报