基于方法的视图
REST framework 也允许使用基于函数的视图。它提供了一套简单的装饰器来包装你的函数视图,以确保它们接收 Request
(而不是 Django HttpRequest
)实例并允许它们返回 Response
(而不是 Django HttpResponse
),并允许你配置该请求的处理方式。
@api_view()
用法:@api_view(http_method_names=['GET'])
api_view
是一个装饰器,用 http_method_names
来设置视图允许响应的 HTTP 方法列表,举个例子,编写一个简单的视图,手动返回一些数据。
from rest_framework.decorators import api_view
@api_view()
def hello_world(request):
return Response({"message": "Hello, world!"})
默认情况下,只有 GET
方法会被接受。其他方法将以 "405 Method Not Allowed"
进行响应。要使用其他方法,请指定视图允许的方法,如下所示:
@api_view(['GET', 'POST'])
def hello_world(request):
if request.method == 'POST':
return Response({"message": "Got some data!", "data": request.data})
return Response({"message": "Hello, world!"})
API 策略装饰器 (policy decorators)
为了覆盖默认设置,REST framework 提供了一系列可以添加到视图中的附加装饰器。这些必须在 @api_view
装饰器之后(下方)。
例如,要创建一个使用 throttle
来确保它每天只能由特定用户调用一次的视图,请使用 @throttle_classes
装饰器,传递一个 throttle
类列表:
from rest_framework.decorators import api_view, throttle_classes
from rest_framework.throttling import UserRateThrottle
class OncePerDayUserThrottle(UserRateThrottle):
rate = '1/day'
@api_view(['GET'])
@throttle_classes([OncePerDayUserThrottle])
def view(request):
return Response({"message": "Hello for today! See you tomorrow!"})
这些装饰器对应于 APIView
上设置的策略属性。
可用的装饰器有:
@renderer_classes(...)
@parser_classes(...)
@authentication_classes(...)
@throttle_classes(...)
@permission_classes(...)
每个装饰器都有一个参数,它必须是一个类列表或者一个类元组。