目录
ModelViewSet、ViewSet 和 GenericAPIView 是 Django REST Framework (DRF) 中常用的视图类,它们有一些区别和不同的作用。
如果某个方法上面加了@property 就是属性方法 可以静态调用
Mypermission 为自己写的权限类。 Basepermission 和Isauthenticated是 rf里的
ModelViewSet 的工作原理如下:
-
定义模型和序列化器:首先,你需要定义一个 Django 模型,并创建一个与该模型相关联的序列化器(Serializer)。序列化器负责将模型实例转换为 JSON 或其他格式,以便在 API 中进行传输。
-
创建 ModelViewSet 类:接下来,你需要创建一个继承自 DRF 中的 ModelViewSet 的类,并指定关联的模型和序列化器。
-
自定义视图行为(可选):ModelViewSet 提供了默认的操作,但你可以根据需要进行自定义。你可以通过覆盖相应的方法来修改默认行为,例如 create()、retrieve()、update()、partial_update()、destroy() 和 list()。
-
配置 URL 映射:在 Django 的 URL 配置文件中,将 ModelViewSet 类与相应的 URL 路径进行映射,这样就可以通过 API 访问视图集中定义的操作。
-
处理请求:当 API 接收到对应 URL 的请求时,DRF 将根据请求的方法(GET、POST、PUT、PATCH、DELETE 等)自动调用相应的视图集方法。例如,当发送 GET 请求时,将调用视图集的 list() 方法返回模型的列表;当发送 POST 请求时,将调用视图集的 create() 方法创建一个新的模型实例。
通过 ModelViewSet,你可以快速构建具有常见模型操作的 RESTful API 视图集,同时还可以通过自定义方法和行为来满足特定的业务需求。
ModelViewSet、ViewSet 和 GenericAPIView 是 Django REST Framework (DRF) 中常用的视图类,它们有一些区别和不同的作用。
-
ModelViewSet:
- ModelViewSet 是一个具有常见模型操作和 RESTful API 功能的方便视图集类。
- 继承自 GenericViewSet 和一组混合类,包括 CreateModelMixin、RetrieveModelMixin、UpdateModelMixin、DestroyModelMixin 和 ListModelMixin。
- 提供了默认的方法,如 create()、retrieve()、update()、partial_update()、destroy() 和 list(),用于处理创建、检索、更新、删除和列表操作。
- ModelViewSet 非常适合用于处理与数据库模型直接相关的 API 操作。
-
ViewSet:
- ViewSet 是一个抽象的视图集类,它提供了常见的操作方法,但不依赖于具体的数据模型。
- 继承自 GenericViewSet。
- 需要手动定义方法和行为,适用于处理不涉及数据库模型的自定义 API 操作。
- 可以根据需求自由定义和组合不同的方法,并在 URL 配置中映射到相应的操作。
-
GenericAPIView:
- GenericAPIView 是一个通用的视图类,它提供了与单个模型实例操作相关的基本方法。
- 继承自 APIView,具有更低级别的抽象。
- 需要与一个或多个混合类(mixins)结合使用,例如 ListModelMixin、CreateModelMixin、RetrieveModelMixin、UpdateModelMixin 和 DestroyModelMixin,以提供常见的操作方法。
- GenericAPIView 适用于处理特定模型实例的操作,但不提供整个视图集的功能。
总结:
- ModelViewSet 适用于处理具有常见模型操作的 API 视图集。
- ViewSet 适用于处理自定义 API 操作,并手动定义方法和行为。
- GenericAPIView 适用于处理特定模型实例操作,并需要与混合类结合使用。
请求进入后会内部调用dispatch方法
在 Django REST Framework (DRF) 中,ViewSet 的 dispatch()
方法是用于处理传入请求的入口点。它是 ViewSet 类的核心方法之一,负责根据请求的方法调用相应的操作方法。
dispatch()
方法主要完成以下动作:
-
请求方法检查:首先,
dispatch()
方法会检查传入请求的方法(GET、POST、PUT、PATCH、DELETE 等)。 -
获取适当的操作方法:根据请求方法,
dispatch()
方法会选择适当的操作方法来处理请求。这些操作方法通常是 ViewSet 中定义的方法,如 create()、retrieve()、update()、partial_update()、destroy() 和 list()。如果请求方法不匹配任何操作方法,则会引发 HTTP 405 Method Not Allowed 错误。 -
执行操作方法:一旦找到适当的操作方法,
dispatch()
方法会调用该方法来处理请求。操作方法会执行相关的业务逻辑,可能包括数据验证、处理请求参数、执行数据库操作等。 -
处理异常:如果在操作方法中引发了异常,
dispatch()
方法会捕获并处理异常。它会尝试将异常转换为适当的 HTTP 响应,并将其返回给客户端。 -
返回响应:最后,
dispatch()
方法会返回操作方法的结果作为 HTTP 响应。通常情况下,响应会包含序列化后的数据,以及相应的状态码、头部信息等。
需要注意的是,dispatch()
方法是 DRF 的内部实现细节,通常不需要直接调用或覆盖该方法。如果你想在 ViewSet 中自定义请求的处理逻辑,可以考虑重写具体的操作方法,或使用装饰器、扩展类等方式来自定义功能。
在 Django REST Framework (DRF) 中,ViewSet 的 initial()
方法是在处理请求之前被调用的一个辅助方法。它是 ViewSet 类的一个钩子方法,用于在请求处理开始之前执行一些初始化操作。
initial()
方法主要完成以下事项:
这是view.py里的 源码 initial
认证 权限 和限流
-
请求解析和处理:
initial()
方法会对请求进行解析和处理,提取出请求中的相关信息,如请求头部、路径参数、查询参数等。这些信息可以在后续的请求处理中使用。 -
初始化上下文:
initial()
方法会为请求创建一个上下文对象,并将相关信息设置到上下文中。上下文对象是一个字典,可以用于存储和传递请求相关的数据。 -
身份验证和权限检查:
initial()
方法可能会执行身份验证和权限检查,以确保请求的发送者有权访问相应的资源。这可能涉及到对用户进行身份验证,检查访问权限,并根据结果设置相应的上下文信息。 -
调用
super()
方法:在执行上述操作之后,initial()
方法通常会调用super().initial(request, *args, **kwargs)
来执行父类(例如 GenericViewSet 或 ViewSet)的initial()
方法。这样可以确保继承链中的其他initial()
方法也被正确执行。
需要注意的是,initial()
方法通常不需要直接调用或覆盖。它是 DRF 的内部实现细节,用于在请求处理之前进行一些通用的初始化操作。如果你需要在 ViewSet 中自定义初始化逻辑,通常可以考虑重写具体的操作方法,或使用装饰器、扩展类等方式来实现自定义的初始化行为。
如果某个方法上面加了@property 就是属性方法 可以静态调用
静态调用
静态调用(Static Calling)通常是指在编译时期就确定了调用的函数或方法。在静态调用中,调用的目标函数在编译阶段就已经确定,因此编译器可以进行静态绑定,将调用与具体的函数实现关联起来。
静态调用的特点包括:
-
编译时确定: 静态调用在编译时就已经确定了调用的目标,编译器会将调用的位置与目标函数的地址关联起来。
-
静态绑定: 由于调用目标在编译时就已知,编译器可以进行静态绑定,将调用和目标函数的实现直接绑定在一起。这意味着不需要在运行时再去查找函数的地址。
-
效率高: 静态调用因为是在编译时确定的,所以没有运行时的额外开销,通常比动态调用效率更高。
-
不适用于多态: 静态调用不适合处理多态情况,即当调用的目标可能在运行时动态改变时,静态调用无法灵活处理。
request.py
这样调用request.user
as_view() 调用-> view() 调用-> dispatch() 调用->
initialize_request() 初始化request -> dispatch调用initial ()
authentication_classes = []
2个默认类 验证对象
如果要自己重写认证,如下图所示 逻辑写在红色箭头处
方法名必须为 authenticate
return 返回值= yuan = request.user
最后在 authentication——classes=【】的列表中加入自己重写的认证类
这样写是一个局部设置