Django-restframework11 APIView

本文详细介绍了Django REST framework中的APIView,包括它与普通View的区别、API策略属性、实例化方法、调度方法及基于函数的视图。APIView处理请求时涉及认证、权限、节流和内容协商,并提供了如renderer_classes、parser_classes等可配置选项。同时,文章还讨论了如何使用API策略装饰器来定制视图行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. APIView与View的区别

  1. APIView是View的子类
  2. 传递给请求处理程序的request实例是REST框架的请求实例,而不是Django的HttpRequest实例
  3. 处理程序返回的基于REST框架的Response,而不是Django的HttpResponse,视图函数将会管理内容协商,然后设置正确的渲染方式
  4. 任何APIException将会被捕捉,然后转换成合适的response对象
  5. 接收到的请求首先被认证,然后赋予相应的权限,然后通过节流器分发给相应的请求处理函数,类似.get()和.post()
    例如;
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.
    """
    # 认证类,通过token认证
    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)

2. API策略属性(可插拔,设置)

  • renderer_classes: 渲染类
  • parser_classes: 解析类
  • authentication_classes: 认证类
  • throttle_classes: 节流类
  • permission_classes: 权限赋予类
  • content_negotiation_class: 内容协商类

3. 应用API策略的实例化方法(获取一个对象)

实现各种可插拔策略的实例化方法,一般不需要重写这些方法
- get_renderers(self)
- get_parsers(self)
- get_authenticators(self)
- get_throttles(self)
- get_permissions(self)
- get_content_negotiator(self)
- get_exception_handler(self)

4. 应用API政策的实施方法(调用方法,应用)

  • .check_permissions(self, request)
  • .check_throttles(self, request)
  • .perform_content_negotiation(self, request, force=False)

5. 调度方法(将请求安排给相应的处理视图)

下面的方法都是由视图函数的dispatch()方法调用,做出的任何操作要么是在处理函数如.get(), .post(), put(), patch() and .delete()之前调用,要么是在之后。
- .initial(self, request, *args, **kwargs)
初始化, 做出的任何操作都需要在视图处理函数之前调用,一般是用于赋予权限、限流和执行内容协议。
- .handle_exception(self, exc)
视图处理函数发生异常,将会被此函数捕捉到,然后抛出一个对象实例,或者再次向上抛出异常。默认处理的异常包含在rest_framework.exceptions.APIException中,也包括django的Http404 and PermissionDenied异常,然后返回一个合适的异常响应
- .initialize_request(self, request, *args, **kwargs)
将请求对象实例化为REST框架的Request对象,而不是Django HttpRequest
- .finalize_response(self, request, response, *args, **kwargs)
确保返回的任何Response已经按照文本协议渲染成正确的文本类型

6. 基于函数的视图

基于类的视图通常是最优解是一个错误

REST也提供一系列简单的装饰器,用来接受一个REST Request实例,然后返回一个REST Response实例,允许你配置这个请求是怎么被处理的。

@api_view()核心功能

@api_view(http_method_names=[‘GET’], exclude_from_schema=False)
- 包含一系列需要处理的请求方法,例如一个返回数据的函数:

from rest_framework.decorators import api_view

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

这个例子用了在settings文件中设置的默认的renderers, parsers, authentication classes,默认只有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!"})

你也可以通过设置exclude_from_schema=True,除去任何自动添加的模式处理,返回原生的django对象??

@api_view(['GET'], exclude_from_schema=True)
def api_docs(request):
    ...

7. API策略装饰器

为了重写默认的配置,REST框架提供了一系列装饰器,但是必须注意他们的使用先后顺序,有的必须在@api_view之前,有的必须在其之后。

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!"})

可用的装饰器:


  • @renderer_classes(…)
  • @parser_classes(…)
  • @authentication_classes(…)
  • @throttle_classes(…)
  • @permission_classes(…)
    每个装饰器都有一个单独的参数,必须是类列表或者类元组。

暂时(可能不准确):
先认证权限-限制然后分发处理函数-用户认证-解析数据-渲染序列化数据-返回数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豆豆orz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值