decorators.py views.py

Class-based Views

Django's class-based views are a welcome departure from the old-style views.

Reinout van Rees

REST框架提供了一个APIView类,它继承了Django的View类。

APIView类在以下方面与常规View类不同:

  • 传递给处理程序方法的请求将是REST框架的Request实例,而不是Django的HttpRequest实例。
  • 处理程序方法可以返回REST框架的Response,而不是Django的HttpResponse 该视图将管理内容协商并在响应上设置正确的渲染器。
  • 任何APIException异常都将被捕获并调解到适当的响应中。
  • 将对传入的请求进行身份验证,并在将请求分派给处理程序方法之前运行适当的权限和/或限制检查。

使用APIView类与使用常规View类几乎相同,像往常一样,传入的请求被分派到适当的处理程序方法,例如.get ().post() 另外,可以在控制API策略的各个方面的类上设置许多属性。

For example:

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import authentication, permissions
from django.contrib.auth.models import User

class ListUsers(APIView):
    """
    View to list all users in the system.

    * Requires token authentication.
    * Only admin users are able to access this view.
    """
    authentication_classes = (authentication.TokenAuthentication,)
    permission_classes = (permissions.IsAdminUser,)

    def get(self, request, format=None):
        """
        Return a list of all users.
        """
        usernames = [user.username for user in User.objects.all()]
        return Response(usernames)

注意:Django REST框架的APIViewGenericAPIView,各种Mixins之间的完整方法,属性和关系,和Viewsets最初可能很复杂。 除了这里的文档之外,Classy Django REST Framework资源为Django REST Framework的每个基于类的视图提供了一个可浏览的引用,包含完整的方法和属性。


API policy attributes

以下属性控制API视图的可插入方面。

.renderer_classes

.parser_classes

.authentication_classes

.throttle_classes

.permission_classes

.content_negotiation_class

API policy instantiation methods

REST框架使用以下方法来实例化各种可插入API策略。 您通常不需要覆盖这些方法。

.get_renderers(self)

.get_parsers(self)

.get_authenticators(self)

.get_throttles(self)

.get_permissions(self)

.get_content_negotiator(self)

.get_exception_handler(self)

API policy implementation methods

在分派到处理程序方法之前调用以下方法。

.check_permissions(self, request)

.check_throttles(self, request)

.perform_content_negotiation(self, request, force=False)

Dispatch methods

以下方法由视图的.dispatch()方法直接调用。 这些执行在调用处理程序方法之前或之后需要执行的任何操作,例如.get().post()put()patch().delete()

.initial(self, request, *args, **kwargs)

执行在调用处理程序方法之前需要执行的任何操作。 此方法用于强制执行权限和限制,以及执行内容协商。

您通常不需要覆盖此方法。

.handle_exception(self, exc)

处理程序方法抛出的任何异常都将传递给此方法,该方法返回Response实例,或者重新引发异常。

默认实现处理rest_framework.exceptions.APIException的任何子类,以及Django的Http404PermissionDenied异常,并返回相应的错误响应。

如果您需要自定义API返回的错误响应,则应该对此方法进行子类化。

.initialize_request(self, request, *args, **kwargs)

确保传递给handler方法的请求对象是Request的实例,而不是通常的Django HttpRequest

您通常不需要覆盖此方法。

.finalize_response(self, request, response, *args, **kwargs)

确保从处理程序方法返回的任何Response对象将呈现为正确的内容类型,这由内容协商确定。

您通常不需要覆盖此方法。


Function Based Views

Saying [that class-based views] is always the superior solution is a mistake.

Nick Coghlan

REST框架还允许您使用基于常规功能的视图。 它提供了一组简单的装饰器,它们包装基于函数的视图,以确保它们接收Request的实例(而不是通常的Django HttpRequest)并允许它们返回Response(而不是Django HttpResponse),并允许您配置请求的处理方式。

@api_view()

Signature: @api_view(http_method_names=['GET'])

此功能的核心是api_view装饰器,它会获取视图应响应的HTTP方法列表。 例如,这就是你如何编写一个只需手动返回一些数据的非常简单的视图:

from rest_framework.decorators import api_view

@api_view()
def hello_world(request):
    return Response({"message": "Hello, world!"})

此视图将使用settings中指定的默认渲染器,解析器,身份验证类等。

默认情况下,只接受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框架提供了一组可添加到视图中的其他装饰器。 These must come after (below) the @api_view decorator. 例如,要创建一个使用throttle的视图以确保它只能由特定用户每天调用一次,请使用@throttle_classes装饰器,传递一个列表油门类:

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子类上设置的属性。

The available decorators are:

  • @renderer_classes(...)
  • @parser_classes(...)
  • @authentication_classes(...)
  • @throttle_classes(...)
  • @permission_classes(...)

这些装饰器中的每一个都接受一个参数,该参数必须是类的列表或元组。

View schema decorator

要覆盖基于函数的视图的默认模式生成,可以使用@schema装饰器。 This must come after (below) the @api_view decorator. For example:

from rest_framework.decorators import api_view, schema
from rest_framework.schemas import AutoSchema

class CustomAutoSchema(AutoSchema):
    def get_link(self, path, method, base_url):
        # override view introspection here...

@api_view(['GET'])
@schema(CustomAutoSchema())
def view(request):
    return Response({"message": "Hello for today! See you tomorrow!"})

此装饰器采用单个AutoSchema实例,AutoSchema子类实例或ManualSchema实例,如架构文档中所述。 您可以传递None以从模式生成中排除视图。

@api_view(['GET'])
@schema(None)
def view(request):
    return Response({"message": "Will not appear in schema!"})