03 请求与响应
一. 请求
from rest_framework.request import Request
class 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)
# 请求对象: request.data 前端以三种编码方式传入的数据,都可以取出来
# 请求对象: request.query_params与Django标准的request.GET相同,只是更换了更正确的名称而已。
二. 响应
1. 参数介绍
from rest_framework.response import Response
class Response:
def __init__(self, data=None, status=None,
template_name=None, headers=None,
exception=False, content_type=None):
"""
:param data: 你要返回的数据,字典
:param status: 返回的状态码,默认是200,
from rest_framework import status # 在这个路径下, 它把所有使用到的状态码都定义成了常量
:param template_name: 渲染的模板名字(自定制模板),不需要了解
:param headers: 响应头,可以往响应头放东西,就是一个字典
:param content_type: 响应的编码格式,application/json 和 text/html
"""
2. 控制返回响应格式浏览器响应成浏览器的格式
postman响应成json格式,浏览器响应好看的页面. 这都是通过配置实现的(默认配置)
# 配置的加载执行顺序: 先从自己类中找 -> 项目的setting中找 -> 默认配置文件中找
# 局部使用: 对某个视图类有效, 在视图类中写如下:
from rest_framework.renderers import JSONRenderer
renderer_classes=[JSONRenderer,]
# 全局使用:全局的视图类,所有请求,都有效. 在setting.py中加入如下:
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': ( # 默认响应渲染类
'rest_framework.renderers.JSONRenderer', # json渲染器
'rest_framework.renderers.BrowsableAPIRenderer', # 浏览API渲染器
)
}
3. 状态码
为了方便设置状态码,REST framewrok在rest_framework.status
模块中提供了常用状态码常量。
导入: from rest_framework import status
提示: 默认响应状态码200
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