drf视图组件

请求与响应

请求

# Request 类的对象---》新的request对象
from rest_framework.request import Request
# 记住的
    __getattr__
    request.data
  request.query_parmas--->self._request.GET-->restful规范里,请求地址中带过滤(查询)条件---》get请求地址中提交的数据在GET中,---》query_parmas:查询参数
  

# 了解--->默认情况下,可以解析 urlencoded,formdata,json
    -如果我们写了一个接口,想只能处理json格式,或者只能处理formdata
    
  
  
# 局部配置
from rest_framework.parsers import JSONParser,FormParser,MultiPartParser
class PublishView(APIView):
    # 局部使用,只针对当前视图类有效,只想处理json格式
    parser_classes = [JSONParser]

# 全局配置---》配置文件--->所有接口都只能解析json格式
REST_FRAMEWORK = {
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',
    ],
}

# 全局配置解析json,局部某个视图函数想能解析formdata格式

视图类中配置一下即可---》局部配置

-如果局部配置如下,会怎么样
parser_classes = [] # 所有格式都补不能解析了

# 使用顺序:我们没有配置,也有默认配置:3个都能解析
    drf有默认配置(最后)----》项目配置文件的配置(其次)----》视图类中配的(优先用)
  drf的默认配置:from rest_framework import settings
  
  
  
  
 # 总结:一般情况下,都使用默认即可,不用配置

响应

Respone:from rest_framework.response import Response

# 属性
data=None,    # 字符串,字典,列表--》给http响应body体中内容-->response对象中取出处理
status=None,  # 响应状态码:1xx,2xx,3xx,默认是200
from rest_framework.status import HTTP_201_CREATED
Response(ser.data,status=HTTP_201_CREATED)

headers=None,      # 响应头 字典
  
---了解---
template_name=None,  # 模板名字(不用),用浏览器访问时,可以改
exception=False,    # 异常处理
content_type=None   # 响应编码格式



# 响应格式---》跟解析格式

# 局部设置
from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer
class BookDetailView(APIView):
    renderer_classes = [JSONRenderer,]
# 全局设置
REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (  # 默认响应渲染类
        'rest_framework.renderers.JSONRenderer',  # json渲染器
        'rest_framework.renderers.BrowsableAPIRenderer',  # 浏览API渲染器
    )
}

视图组件

# APIView  
    from rest_framework.views import APIView
  -类属性
      -renderer_classes,parser_classes。。。
  -get方法,post方法,delete方法写法跟之前的View一样,只不过request对象变成了新的request丢下
  -比之前的View多了三大认证和全局异常处理
  
  
# GenericAPIView  继承了APIView  ,多了属性和方法
    from rest_framework.generics import GenericAPIView
  -属性(先记两个)
      -queryset = None
    -serializer_class = None
  -方法
      -get_queryset
    -get_object
    -get_serializer
    
    
    
# 5个视图扩展类(不是视图类,没有集成APIView,需要配合GenericAPIView)
  from rest_framework.mixins
  CreateModelMixin,
  ListModelMixin,
  DestroyModelMixin,
  RetrieveModelMixin,
  UpdateModelMixin
  
  
  
# 9个视图子类 
  from rest_framework.generics 
  CreateAPIView,
  ListAPIView,
  DestroyAPIView,
  RetrieveAPIView,
  UpdateAPIView
  ListCreateAPIView,
  RetrieveUpdateAPIView,
  RetrieveUpdateDestroyAPIView,
  RetrieveDestroyAPIView

# 视图集
    from rest_framework.viewsets 
  # 两个视图类
  ModelViewSet,ReadOnlyModelViewSet
  # 视图类
  ViewSet,GenericViewSet,
  # 魔法类
  ViewSetMixin

 action装饰器

  # action装饰器
      -只要是继承ViewSetMixin视图类中方法,都可以加action装饰器,只要加了,自动生成路由会多生成--》127.0.0.1:8080/test/login:get或post都能触发
    @action(methods=['GET','POST'],detail=False)
    def login(self,request):
      
   # 如果写法如下,生成的路径是127.0.0.1:8080/test/数字/login
    @action(methods=['GET','POST'],detail=True)
    def login(self,request):

路由的写法

# 路由写法有三种
    path('books/<int:pk>', views.BookDetailView.as_view()),
  # 继承了ViewSetMixin
  path('publish/', views.PublishView.as_view({'get':'list','post':'create'}))
  # 自动生成路由
  from rest_framework.routers import SimpleRouter,DefaultRouter
  router = SimpleRouter()
  router.register('publish', views.PublishView, 'publish')
    # 路由注册,两种方式
  path('api/v1/', include(router.urls)),
  urlpatterns+=router.urls
  # 路由类,有连个SimpleRouter,DefaultRouter,DefaultRouter自动生成的路由更多
  
  # action装饰器---》只要继承ViewSetMixin都能自动生成路由
      # methods=请求方法,列表,
    # detail=是否带id,
    # url_path=地址如果不写,默认已方法名为地址,
    # url_name=别名
    # 写成如下,自动生成路由会生成一条路径:127.0.0.1:8080/test/login -->get,post都会触发
    @action(methods=['GET','POST'],detail=True)
    def login(self,request):
      
   # 如果写法如下,生成的路径是127.0.0.1:8080/test/数字/login
    @action(methods=['GET','POST'],detail=True)
    def login(self,request):
      

 

posted @ 2022-03-31 20:24  椰子皮0oo0  阅读(31)  评论(0)    收藏  举报
1