Request 与 Response
1. Request
REST framework 传入视图的request对象不再是Django默许的HttpRequest对象,而是REST framework供给的扩大了HttpRequest类的Request类的对象。
REST framework 供给了Parser解析器,在吸收到要求后会主动依据Content-Type指明的要求数据类型(如JSON、表单等)将要求数据进行parse解析,解析为类字典对象保留到Request对象中。
Request对象的数据是主动依据前端发送数据的格局进行解析以后的成果。
不管前端发送的哪类格局的数据,我们都可以以统一的方法读取数据。
常常使用属性
1).data
request.data 返回解析以后的要求体数据。相似于Django中尺度的request.POST和 request.FILES属性,但供给以下特征:
包括懂得析以后的文件和非文件数据
包括了对POST、PUT、PATCH要求方法解析后的数据
应用了REST framework的parsers解析器,不但支撑表单类型数据,也支撑JSON数据
2).query_params
request.query_params与Django尺度的request.GET雷同,只是改换了更准确的名称而已。
2. Response
rest_framework.response.Response
REST framework供给了一个响应类Response,应用该类构造响应对象时,响应的具体数据内容会被转换(render渲染)成符合前端需求的类型。
REST framework供给了Renderer 渲染器,用来依据要求头中的Accept(吸收数据类型声明)来主动转换响应数据到对应格局。如果前端要求中未进行Accept声明,则会采取默许方法处置响应数据,我们可以通过配置来修正默许响应格局。
REST_FRAMEWORK = {
"DEFAULT_RENDERER_CLASSES": ( # 默许响应渲染类
"rest_framework.renderers.JSONRenderer", # json渲染器
"rest_framework.renderers.BrowsableAPIRenderer", # 阅读API渲染器
)
}
构造方法
Response(data, status=None, template_name=None, headers=None, content_type=None)
data数据不要是render处置以后的数据,只需传递python的内建类型数据便可,REST framework会应用renderer渲染器处置data。
data不能是庞杂构造的数据,如Django的模型类对象,对这样的数据我们可以应用Serializer序列化器序列化处置后(转为了Python字典类型)再传递给data参数。
参数解释:
data: 为响应预备的序列化处置后的数据;
status: 状况码,默许200;
template_name: 模板名称,如果应用HTMLRenderer 时需指明;
headers: 用于寄存响应头信息的字典;
content_type: 响应数据的Content-Type,通常此参数无需传递,REST framework会依据前端所需类型数据来设置该参数。
常常使用属性:
1).data
传给response对象的序列化后,但还没有render处置的数据
2).status_code
状况码的数字
3).content
经过render处置后的响应数据
3. 状况码
为了便利设置状况码,REST framewrok在rest_framework.status模块中供给了常常使用状况码常量。
1)信息告诉 - 1xx
HTTP_100_CONTINUE
HTTP_101_SWITCHING_PROTOCOLS
2)胜利 - 2xx
HTTP_200_OK
HTTP_201_CREATED
HTTP_202_ACCEPTED
HTTP_203_NON_AUTHORITATIVE_INFORMATION
HTTP_204_NO_CONTENT
HTTP_205_RESET_CONTENT
HTTP_206_PARTIAL_CONTENT
HTTP_207_MULTI_STATUS
3)重定向 - 3xx
HTTP_300_MULTIPLE_CHOICES
HTTP_301_MOVED_PERMANENTLY
HTTP_302_FOUND
HTTP_303_SEE_OTHER
HTTP_304_NOT_MODIFIED
HTTP_305_USE_PROXY
HTTP_306_RESERVED
HTTP_307_TEMPORARY_REDIRECT
4)客户端毛病 - 4xx
HTTP_400_BAD_REQUEST
HTTP_401_UNAUTHORIZED
HTTP_402_PAYMENT_REQUIRED
HTTP_403_FORBIDDEN
HTTP_404_NOT_FOUND
HTTP_405_METHOD_NOT_ALLOWED
HTTP_406_NOT_ACCEPTABLE
HTTP_407_PROXY_AUTHENTICATION_REQUIRED
HTTP_408_REQUEST_TIMEOUT
HTTP_409_CONFLICT
HTTP_410_GONE
HTTP_411_LENGTH_REQUIRED
HTTP_412_PRECONDITION_FAILED
HTTP_413_REQUEST_ENTITY_TOO_LARGE
HTTP_414_REQUEST_URI_TOO_LONG
HTTP_415_UNSUPPORTED_MEDIA_TYPE
HTTP_416_REQUESTED_RANGE_NOT_SATISFIABLE
HTTP_417_EXPECTATION_FAILED
HTTP_422_UNPROCESSABLE_ENTITY
HTTP_423_LOCKED
HTTP_424_FAILED_DEPENDENCY
HTTP_428_PRECONDITION_REQUIRED
HTTP_429_TOO_MANY_REQUESTS
HTTP_431_REQUEST_HEADER_FIELDS_TOO_LARGE
HTTP_451_UNAVAILABLE_FOR_LEGAL_REASONS
5)服务器毛病 - 5xx
HTTP_500_INTERNAL_SERVER_ERROR
HTTP_501_NOT_IMPLEMENTED
HTTP_502_BAD_GATEWAY
HTTP_503_SERVICE_UNAVAILABLE
HTTP_504_GATEWAY_TIMEOUT
HTTP_505_HTTP_VERSION_NOT_SUPPORTED
HTTP_507_INSUFFICIENT_STORAGE
HTTP_511_NETWORK_AUTHENTICATION_REQUIRED
视图集ViewSet
应用视图集ViewSet,可以将一系列逻辑相干的动作放到一个类中:
list() 供给一组数据
retrieve() 供给单个数据
create() 创立数据
update() 保留数据
destory() 删除数据
ViewSet视图集类不再实现get()、post()等办法,而是实现动作 action 如 list() 、create() 等。
视图集只在应用as_view()办法的时候,才会将action动作与具体要求方法对应上。如:
class BookInfoViewSet(viewsets.ViewSet):
def list(self, request):
...
def retrieve(self, request, pk=None):
...
在设置路由时,我们可以以下操作
urlpatterns = [
url(r"^books/$", BookInfoViewSet.as_view("get", "list")),
url(r"^books/(?P<pk>\d+)/$", BookInfoViewSet.as_view("get", "retrieve"))
]
action属性
在视图集中,我们可以通过action对象属性来获得当前要求视图集时的action动作是哪一个。
例如:
def get_serializer_class(self):
if self.action == "create":
return OrderCommitSerializer
else:
return OrderDataSerializer
常常使用视图集父类
1) ViewSet
继承自APIView,作用也与APIView根本相似,供给了身份认证、权限校验、流量管理等。
在ViewSet中,没有供给任何动作action办法,须要我们自己实现action办法。
2)GenericViewSet
继承自GenericAPIView,作用也与GenericAPIVIew相似,供给了get_object、get_queryset等办法便于列表视图与详情信息视图的开发。
3)ModelViewSet
继承自GenericAPIVIew,同时包括了ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestoryModelMixin。
4)ReadOnlyModelViewSet
继承自GenericAPIVIew,同时包括了ListModelMixin、RetrieveModelMixin。
视图集中定义附加action动作
在视图集中,除上述默许的办法动作外,还可以添加自定义动作。
添加自定义动作须要应用rest_framework.decorators.action装潢器。
以action装潢器装潢的办法名会作为action动作名,与list、retrieve同等。
action装潢器可以吸收两个参数:
methods: 该action支撑的要求方法,列表传递
detail: 表现是action中要处置的是不是是视图资源的对象(即是不是通过url路径获得主键)
True 表现应用通过URL获得的主键对应的数据对象
False 表现不应用URL获得主键
举例:
from rest_framework import mixins
from rest_framework.viewsets import GenericViewSet
from rest_framework.decorators import action
class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
# detail为False 表现不须要处置具体的BookInfo对象
@action(methods=["get"], detail=False)
def latest(self, request):
"""
返回最新的图书信息
"""
book = BookInfo.objects.latest("id")
serializer = self.get_serializer(book)
return Response(serializer.data)
# detail为True,表现要处置具体与pk主键对应的BookInfo对象
@action(methods=["put"], detail=True)
def read(self, request, pk):
"""
修正图书的阅读量数据
"""
book = self.get_object()
book.bread = request.data.get("read")
book.save()
serializer = self.get_serializer(book)
return Response(serializer.data)
url的定义
urlpatterns = [
url(r"^books/$", views.BookInfoViewSet.as_view({"get": "list"})),
url(r"^books/latest/$", views.BookInfoViewSet.as_view({"get": "latest"})),
url(r"^books/(?P<pk>\d+)/$", views.BookInfoViewSet.as_view({"get": "retrieve"})),
url(r"^books/(?P<pk>\d+)/read/$", views.BookInfoViewSet.as_view({"put": "read"})),
]
路由Routers
对视图集ViewSet,我们除可以自己手动指明要求方法与动作action之间的对应关系外,还可以应用Routers来赞助我们迅速实现路由信息。
REST framework供给了两个router
SimpleRouter
DefaultRouter
1. 应用办法
1) 创立router对象,并注册视图集,例如
from rest_framework import routers
router = routers.SimpleRouter()
router.register(r"books", BookInfoViewSet, base_name="book")
register(prefix, viewset, base_name)
prefix 该视图集的路由前缀
viewset 视图集
base_name 路由名称的前缀
如上述代码会构成的路由以下:
^books/$ name: book-list
^books/{pk}/$ name: book-detail
2)添加路由数据
可以有两种方法:
urlpatterns = [
...
]
urlpatterns += router.urls
或
urlpatterns = [
...
url(r"^", include(router.urls))
]
2. 视图集中包括附加action的
class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
@action(methods=["get"], detail=False)
def latest(self, request):
...
@action(methods=["put"], detail=True)
def read(self, request, pk):
...
此视图集会构成的路由:
^books/latest/$ name: book-latest
^books/{pk}/read/$ name: book-read
3. 路由router构成URL的方法
1) SimpleRouter
SimpleRouter
2)DefaultRouter
DefaultRouter
DefaultRouter与SimpleRouter的区分是,DefaultRouter会多附带一个默许的API根视图,返回一个包括所有列表视图的超连接响应数据。Request 与 Response
1. Request
REST framework 传入视图