DRF API Guide
1. Requests
REST framework
的Request
继承自标准的HttpRequest
,增加对REST
框架灵活的请求解析和请求认证的支持。
1.1 Request parsing
/请求解析
REST framework
的Request
提供了灵活的请求解析,允许你以操作form表单数据的方式处理JSON
数据或其它mediatypes
。
.data
request.data
返回request body
的解析内容,这类似于标准的request.POST
和request.FILES
,
.query_params
request.query_params
是request.GET
的同义词,不仅可以替换reqesut.GET
,为了保持代码的统一性,任何HTTP
方法类型都可以包括query parameters
,不仅仅是GET request
。
.parsers
APIView
或@api_view
装饰器确保request.parsers
自动设置为Parser
实例的列表,基于view
上的parser_classes
和DEFAULT_PARSER_CLASSES
设置。
通常不需要访问这个属性。
假如
client
发送了格式错误的内容,这时访问request.data
可能抛出ParseError
。默认REST framework
的APIView
类或@api_view
装饰器将捕获这个error
,并返回404_Bad_Request
的响应类型。假如
client
发送了一个不支持的content-type
类型,这时UnsupportedMediaType
异常将被抛出,默认将被捕获,并返回415_Unsupported_Media_type
的响应类型。
1.2 Content negotiation
/内容协商
request
暴露以下属性,允许你自行决定协商阶段的结果,你可以为不同的media type
选择不同的序列化方案。
.accepted_renderer
内容协商阶段选择的内容renderer
实例。
.accepted_media_type
内容协商阶段选择的内容media type
字符串。
1.3 Authentication
/认证
REST framework
提供了灵活的、基于每个request
的认证,提供:
- 对于不同的
API
使用不同的认证策略。 - 支持使用多个认证策略。
- 为传入的
reqesut
提供user
和token
相关信息。
.user
request.user
,典型的是django.contrib.auth.models.User
的实例,依赖于所使用的认证策略。
.auth
request.auth
返回任何附加的认证上下文。依赖于不同的认证策略扩展了request.auth
。典型的实例是一个token
。
假如request
没有认证或者没有提供上下文,则request.auth
默认是None
。
.authenticators
APIView
或@api_view
装饰器确保request.authenticators
自动设置为Authentication
实例的列表,基于view
上的authentication_classes
和DEFAULT_AUTHENTICATORS_CLASSES
设置。
通常不需要访问这个属性
当调用
.user
和.auth
属性时可能会抛出WrappedAttibuteError
,这个错误源于认证的AttributeError
,抛出时重新封装了不同的异常类型,防止外部访问受限,Python不会识别这个错误是来源于认证器的,而是假设request
没有.user
和.auth
。
1.4 Browser enhancements
/浏览增强
REST framework
支持一些浏览器增强功能,例如PUT
,PATCH
和DELETE
。
.method
request.method
返回请求方法的小写字符串。同时支持PUT
,PATCH
和DELETE
。
.content_type
request.content_type
返回HTTP
请求体的media
类型字符串对象,未提供则返回空串。
通常不需要访问这个属性,默认Django
会处理。
如果您确实需要访问请求的内容类型,您应该优先使用.content_type
属性而不是使用request.META.get('HTTP_CONTENT_TYPE')
,因为它为基于浏览器的非表单内容提供了透明支持。
.stream
request.stream
返回一个流,代表请求体的内容。
通常不需要访问这个属性,默认Django
会处理。
1.5 Standard HttpRequest attributes
/标准的HttpRequest属性
作为扩展了Django
的HttpRequest
的REST
的Request
,所有其他的属性和方法都有效,比如request.META
和request.session
的字典。
请注意,由于实现原因,Request
类并不继承自HttpRequest
类,而是使用组合来扩展该类。
理解
DRF
的Request
类型是对Django HttpRequest
的增强,提供了更加统一的request
使用方法,包括解析和认证:
- [ ] 解析用的多的是
.data
和.query_params
,分别获取请求体参数和URL查询参数,提供了统一的参数获取方式。 - [ ] 认证用的多的是
.user
和.auth
,分别提供了不同认证策略下的认证相关信息,.user是Django
的User
,典型的基于Token
的认证策略下.user
是已认证用户,.auth
是已认证的token
。
DRF
的Request
的内部实现不是继承于Django
的HttpRequest
,而是用一种混入方式扩展了该类,源码中request._request
即为Django
的HttpRequest
。
2. Responses
DRF
的Response
类是Django SimpleTemplateResponse
的子类,提供了对client
请求内容的统一呈现方式,可以渲染多个content types
,通常不需要使用该类,而应该使用HttpResponse
和StreamHttpResponse
,除非必要,应该总是在APIView
和@api_view
中返回Response
。
2.1 Creating response
/创建
Response()
签名:Response(data, status=None, template_name=None, headers=None, content_type=None)
与常规HttpResponse
对象不同,您不需要用渲染后的内容实例化Response对象。可以直接传入需要渲染的数据,使用原生的Python类型。
Response
类使用的渲染器无法处理复杂数据类型,如Django
的Model
实例,在创建Response
之前,需要使用DRF
的Serializer
类将数据进行序列化,也可以自定义Serializer
。
- data: 序列化的数据.
status:response
的状态码,默认是200。- template_name: 假如使用
HTMLRenderer
,则这里代表模板名字。 - headers:
HTTP headers
字典。 - content_type: 自动通过内容协商进行设置,因此你不需要指定该值。
Attributes
.data
未序列化的数据。
.status_code
HTTP响应状态码
.content
渲染内容,.render()
方法被调用方可访问.content
.template_name
仅在使用了HTMLRenderer
及其它定制的渲染器,template_name
才提供。
.accepted_renderer
用于渲染内容的渲染器实例。在APIView
和@api_view
中自动被设置。
.accepted_media_type
内容协商阶段的media type
.在APIView
和@api_view
中自动被设置。
2.2 Standard HttpResponse attributes
Response
类继承自SimpleTemplateResponse
,常用的属性和方法均可使用,例如你可以使用标准方法设置header
:
response = Response()
response['Cache-Control'] = 'no-cache'
.render()
签名:.render()
与其他的TemplateResponse
一样,这个方法被调用用于渲染序列化数据到最终的response
的内容。
通常不需要访问这个属性,默认Django
会处理。
理解
Response
继承自SimpleTemplateResponse
,提供了对APIView
和@api_view
的响应内容,通常我们使用HttpResponse
和StreamHttpResponse
,同时也不需要关注content-type
等属性的管理,仅需要关注data
的序列化,以呈现内容。