【一】新的Request对象和Response
【1】Request
-
REST framework 传入视图的request对象不再是Django默认的HttpRequest对象,而是REST framework提供的扩展了HttpRequest类的Request类的对象。
-
REST framework 提供了Parser解析器,在接收到请求后会自动根据Content-Type指明的请求数据类型(如JSON、表单等)将请求数据进行parse解析,解析为类字典[QueryDict]对象保存到Request对象中。
-
Request对象的数据是自动根据前端发送数据的格式进行解析之后的结果。
-
无论前端发送的哪种格式的数据,我们都可以以统一的方式读取数据。
-
以后全是cbv ,继承一个基类 --- drf的APIView(也继承了Django的view)及子类,继承APIView后,响应统一用drf的响应
from rest_framework.views import APIView class BookView(APIView): def get(self, request): 1 request 请求对象:http请求的所有内容,都会在这个对象中 2 继承APIView后的request对象,不是之前的request对象了 原来的在request._request print(type(request)) # 新的request # <class 'rest_framework.request.Request'> # 原来的request # <class 'django.core.handlers.wsgi.WSGIRequest'> 3 用起来跟之前一样 print(request.method) print(request.POST) print(request.GET) print(request.get_full_path()) 4 多了一个request.data方法(重要) 无论哪种编码格式,请求体的数据,都在这里面 http请求的不同编码方式 urlencoded,form-data:是QueryDict的对象 json:是普通字典对象 但是,都当字典用即可 5 request.query_params 与 Django标准的request.GET相同,只是更换了名称而已 @property def query_params(self): return self._request.GET 6 request.FILES 前端传的文件从这里取 7 以后所有的 request对象就是 http请求的请求数据包装成了对象 所有的http请求的数据,都能从这个对象中取出来
【2】Response
rest_framework.response.Response
REST framework提供了一个响应类Response
,使用该类构造响应对象时,响应的具体数据内容会被转换(render渲染)成符合前端需求的类型。
REST framework提供了Renderer
渲染器,用来根据请求头中的Accept
(接收数据类型声明)来自动转换响应数据到对应格式。如果前端请求中未进行Accept声明,则会采用默认方式处理响应数据,我们可以通过配置来修改默认响应格式。
可以在rest_framework.settings查找所有的drf默认配置项
REST_FRAMEWORK = { 'DEFAULT_RENDERER_CLASSES': ( # 默认响应渲染类 'rest_framework.renderers.JSONRenderer', # json渲染器 'rest_framework.renderers.BrowsableAPIRenderer', # 浏览API渲染器 ) }
(1)Response构造
Response(data=None, status=None,template_name=None, headers=None,exception=False, content_type=None) # 总结 Response data=None # 响应体:可以传 字典,列表或字符串 status=None# http响应 状态码--》drf封装了所有常量 HTTP_200_OK = 200 template_name=None# 忽略掉--》指定使用浏览器访问返回的模板,没写用默认模板 headers=None # 响应头 exception=False# 异常 content_type=None # 响应编码格式,一般不动,都用json
(2)状态码
-
为了方便设置状态码,REST framewrok在
rest_framework.status
模块中提供了常用状态码常量。
信息告知 - 1xx
HTTP_100_CONTINUE HTTP_101_SWITCHING_PROTOCOLS
成功 - 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
重定向 - 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
客户端错误 - 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
服务器错误 - 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
【二】drf之请求响应
【1】请求
# 当前知道drf请求可以支持 三种编码格式 request.data ---> 取出请求体的内容 # 那么后期,如果有个上传文件接口 ---》 只接受 form-data类型,其他类型不允许,这时怎么做 # 控制某个接口,只能处理 某一种 编码格式,其他的都不行 # 局部使用 from rest_framework.parsers import JSONParser, FormParser, MultiPartParser class BookView(APIView): # 在视图类上,配置---》只运行json格式 parser_classes = [JSONParser] # 全局使用 REST_FRAMEWORK = { # 解析类 'DEFAULT_PARSER_CLASSES': [ 'rest_framework.parsers.JSONParser', 'rest_framework.parsers.FormParser', 'rest_framework.parsers.MultiPartParser', ]} # 全局使用三个时,局部再定义使用一个时,其他两个就会被禁用 class BookView(APIView): # 在视图类上,配置---》只运行json格式 parser_classes = [JSONParser] # 总结 解析类使用顺序 优先使用视图类中配置的parser_classes 其次使用项目setting配置文件的:REST_FRAMEWORK ----》 DEFAULT_PARSER_CLASSE 最后会使用drf内置的rest_dramework\settings.py文件---》三个都有
【2】响应
# 局部使用 from rest_framework.renderers import JSONRenderer, BrowsableAPIRenderer class BookView(APIView): renderer_classes = [JSONRenderer] # 全局使用 REST_FRAMEWORK = { # 解析类 'DEFAULT_RENDERER_CLASSES': [ 'rest_framework.renderers.JSONRenderer', 'rest_framework.renderers.TemplateHTMLRenderer', ] } # 局部禁用 class BookView(APIView): # 局部中使用JSONRenderer,另一个BrowsableAPIRenderer就被禁用了 renderer_classes = [JSONRenderer]