请求与响应
请求
# 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):