初学DRF

目录

ModelViewSet 的工作原理如下:

ModelViewSet、ViewSet 和 GenericAPIView 是 Django REST Framework (DRF) 中常用的视图类,它们有一些区别和不同的作用。

在 Django REST Framework (DRF) 中,ViewSet 的 dispatch() 方法是用于处理传入请求的入口点。它是 ViewSet 类的核心方法之一,负责根据请求的方法调用相应的操作方法。

在 Django REST Framework (DRF) 中,ViewSet 的 initial() 方法是在处理请求之前被调用的一个辅助方法。它是 ViewSet 类的一个钩子方法,用于在请求处理开始之前执行一些初始化操作。

这是view.py里的 源码 initial

认证 权限 和限流

如果某个方法上面加了@property 就是属性方法 可以静态调用

静态调用

 这样调用         request.user

2个默认类 验证对象 

如果要自己重写认证,如下图所示 逻辑写在红色箭头处

权限

Mypermission 为自己写的权限类。 Basepermission 和Isauthenticated是 rf里的


ModelViewSet 的工作原理如下:

  1. 定义模型和序列化器:首先,你需要定义一个 Django 模型,并创建一个与该模型相关联的序列化器(Serializer)。序列化器负责将模型实例转换为 JSON 或其他格式,以便在 API 中进行传输。

  2. 创建 ModelViewSet 类:接下来,你需要创建一个继承自 DRF 中的 ModelViewSet 的类,并指定关联的模型和序列化器。

  3. 自定义视图行为(可选):ModelViewSet 提供了默认的操作,但你可以根据需要进行自定义。你可以通过覆盖相应的方法来修改默认行为,例如 create()、retrieve()、update()、partial_update()、destroy() 和 list()。

  4. 配置 URL 映射:在 Django 的 URL 配置文件中,将 ModelViewSet 类与相应的 URL 路径进行映射,这样就可以通过 API 访问视图集中定义的操作。

  5. 处理请求:当 API 接收到对应 URL 的请求时,DRF 将根据请求的方法(GET、POST、PUT、PATCH、DELETE 等)自动调用相应的视图集方法。例如,当发送 GET 请求时,将调用视图集的 list() 方法返回模型的列表;当发送 POST 请求时,将调用视图集的 create() 方法创建一个新的模型实例。

通过 ModelViewSet,你可以快速构建具有常见模型操作的 RESTful API 视图集,同时还可以通过自定义方法和行为来满足特定的业务需求。

ModelViewSet、ViewSet 和 GenericAPIView 是 Django REST Framework (DRF) 中常用的视图类,它们有一些区别和不同的作用。

  1. ModelViewSet:

    • ModelViewSet 是一个具有常见模型操作和 RESTful API 功能的方便视图集类。
    • 继承自 GenericViewSet 和一组混合类,包括 CreateModelMixin、RetrieveModelMixin、UpdateModelMixin、DestroyModelMixin 和 ListModelMixin。
    • 提供了默认的方法,如 create()、retrieve()、update()、partial_update()、destroy() 和 list(),用于处理创建、检索、更新、删除和列表操作。
    • ModelViewSet 非常适合用于处理与数据库模型直接相关的 API 操作。
  2. ViewSet:

    • ViewSet 是一个抽象的视图集类,它提供了常见的操作方法,但不依赖于具体的数据模型。
    • 继承自 GenericViewSet。
    • 需要手动定义方法和行为,适用于处理不涉及数据库模型的自定义 API 操作。
    • 可以根据需求自由定义和组合不同的方法,并在 URL 配置中映射到相应的操作。
  3. GenericAPIView:

    • GenericAPIView 是一个通用的视图类,它提供了与单个模型实例操作相关的基本方法。
    • 继承自 APIView,具有更低级别的抽象。
    • 需要与一个或多个混合类(mixins)结合使用,例如 ListModelMixin、CreateModelMixin、RetrieveModelMixin、UpdateModelMixin 和 DestroyModelMixin,以提供常见的操作方法。
    • GenericAPIView 适用于处理特定模型实例的操作,但不提供整个视图集的功能。

总结:

  • ModelViewSet 适用于处理具有常见模型操作的 API 视图集。
  • ViewSet 适用于处理自定义 API 操作,并手动定义方法和行为。
  • GenericAPIView 适用于处理特定模型实例操作,并需要与混合类结合使用。

请求进入后会内部调用dispatch方法

在 Django REST Framework (DRF) 中,ViewSet 的 dispatch() 方法是用于处理传入请求的入口点。它是 ViewSet 类的核心方法之一,负责根据请求的方法调用相应的操作方法。

dispatch() 方法主要完成以下动作:

  1. 请求方法检查:首先,dispatch() 方法会检查传入请求的方法(GET、POST、PUT、PATCH、DELETE 等)。

  2. 获取适当的操作方法:根据请求方法,dispatch() 方法会选择适当的操作方法来处理请求。这些操作方法通常是 ViewSet 中定义的方法,如 create()、retrieve()、update()、partial_update()、destroy() 和 list()。如果请求方法不匹配任何操作方法,则会引发 HTTP 405 Method Not Allowed 错误。

  3. 执行操作方法:一旦找到适当的操作方法,dispatch() 方法会调用该方法来处理请求。操作方法会执行相关的业务逻辑,可能包括数据验证、处理请求参数、执行数据库操作等。

  4. 处理异常:如果在操作方法中引发了异常,dispatch() 方法会捕获并处理异常。它会尝试将异常转换为适当的 HTTP 响应,并将其返回给客户端。

  5. 返回响应:最后,dispatch() 方法会返回操作方法的结果作为 HTTP 响应。通常情况下,响应会包含序列化后的数据,以及相应的状态码、头部信息等。

需要注意的是,dispatch() 方法是 DRF 的内部实现细节,通常不需要直接调用或覆盖该方法。如果你想在 ViewSet 中自定义请求的处理逻辑,可以考虑重写具体的操作方法,或使用装饰器、扩展类等方式来自定义功能。

在 Django REST Framework (DRF) 中,ViewSet 的 initial() 方法是在处理请求之前被调用的一个辅助方法。它是 ViewSet 类的一个钩子方法,用于在请求处理开始之前执行一些初始化操作。

initial() 方法主要完成以下事项:

这是view.py里的 源码 initial

认证 权限 和限流

  1. 请求解析和处理:initial() 方法会对请求进行解析和处理,提取出请求中的相关信息,如请求头部、路径参数、查询参数等。这些信息可以在后续的请求处理中使用。

  2. 初始化上下文:initial() 方法会为请求创建一个上下文对象,并将相关信息设置到上下文中。上下文对象是一个字典,可以用于存储和传递请求相关的数据。

  3. 身份验证和权限检查:initial() 方法可能会执行身份验证和权限检查,以确保请求的发送者有权访问相应的资源。这可能涉及到对用户进行身份验证,检查访问权限,并根据结果设置相应的上下文信息。

  4. 调用 super() 方法:在执行上述操作之后,initial() 方法通常会调用 super().initial(request, *args, **kwargs) 来执行父类(例如 GenericViewSet 或 ViewSet)的 initial() 方法。这样可以确保继承链中的其他 initial() 方法也被正确执行。

需要注意的是,initial() 方法通常不需要直接调用或覆盖。它是 DRF 的内部实现细节,用于在请求处理之前进行一些通用的初始化操作。如果你需要在 ViewSet 中自定义初始化逻辑,通常可以考虑重写具体的操作方法,或使用装饰器、扩展类等方式来实现自定义的初始化行为。

如果某个方法上面加了@property 就是属性方法 可以静态调用

静态调用

静态调用(Static Calling)通常是指在编译时期就确定了调用的函数或方法。在静态调用中,调用的目标函数在编译阶段就已经确定,因此编译器可以进行静态绑定,将调用与具体的函数实现关联起来。

静态调用的特点包括:

  1. 编译时确定: 静态调用在编译时就已经确定了调用的目标,编译器会将调用的位置与目标函数的地址关联起来。

  2. 静态绑定: 由于调用目标在编译时就已知,编译器可以进行静态绑定,将调用和目标函数的实现直接绑定在一起。这意味着不需要在运行时再去查找函数的地址。

  3. 效率高: 静态调用因为是在编译时确定的,所以没有运行时的额外开销,通常比动态调用效率更高。

  4. 不适用于多态: 静态调用不适合处理多态情况,即当调用的目标可能在运行时动态改变时,静态调用无法灵活处理。

request.py

 这样调用request.user

 as_view()  调用-> view()  调用->  dispatch() 调用->

initialize_request() 初始化request  -> dispatch调用initial ()

authentication_classes = []

2个默认类 验证对象 

如果要自己重写认证,如下图所示 逻辑写在红色箭头处

方法名必须为 authenticate

return  返回值= yuan =   request.user 

最后在 authentication——classes=【】的列表中加入自己重写的认证类

这样写是一个局部设置

权限

Mypermission 为自己写的权限类。 Basepermission 和Isauthenticated是 rf里的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值