APIView
入口函数
as_view
queryset检测
不要直接操作queryset, 直接操作会发生多个请求之间的数据错乱
推荐使用 all 或者 get_queryset
调用父类中的as_view
参数检测
定义闭包函数
记录数据
dispatch
dispatch
重写方法
做了一个Request转换(初始化)
之后进行整体初始化
格式化后缀
内容决策
版本决策
强制升级
推荐升级
没有升级
执行认证
检查权限
节流,限流
根据请求方法进行分发
如果上述处理过程中出线异常,异常并不会直接被抛,异常会被捕获
提供异常策略
最终对响应进行统一处理
最后返回
generics
APIView
属性
filter_backends
lookup_field
lookup_url_kwarg
pagination_class
queryset
serializer_class
方法
get_queryset
get_object
get_serializer
get_serializer_class
get_serializer_context
filter_queryset
paginator
使用property修饰
paginate_queryset
get_paginated_response
CreateAPIView
继承
GenericAPIView
CreateModelMixin
方法
post
create
ListAPIView
继承
GenericAPIView
ListModelMixin
方法
get
list
RetrieveAPIView
继承
GenericAPIView
RetrieveModelMixin
方法
get
retrieve
DestroyAPIView
继承
GenericAPIView
DestroyModelMixin
方法
delete
destroy
UpdateAPIView
继承
GenericAPIView
UpdateModelMixin
方法
put
update
patch
partial_update
ListCreateAPIView
继承
GenericAPIView
ListModelMixin
CreateModelMixin
方法
post
create
get
list
RetrieveUpdateAPIView
继承
GenericAPIView
RetrieveModelMixin
UpdateModelMixin
方法
get
retrieve
put
update
patch
partial_update
RetrieveDestroyAPIView
继承
GenericAPIView
RetrieveModelMixin
DestroyModelMixin
方法
get
retrieve
delete
destroy
RetrieveUpdateDestroyAPIView
继承
GenericAPIView
RetrieveModelMixin
UpdateModelMixin
DestroyModelMixin
方法
get
retrieve
put
update
patch
partial_update
delete
destroy
CreateModelMixin
函数
create
perform_create
get_success_headers
ListModelMixin (复数)
函数
list
RetrieveModelMixin (单数)
函数
retrieve
UpdateModelMixin (单数)
函数
perform_update
partial_update
DestroyModelMixin (单数)
函数
destroy
perform_destroy
用法(简单的注册登陆)
class User(models.Model): u_name = models.CharField(max_length=32, unique=True) u_password = models.CharField(max_length=256) @classmethod def get_user(cls, u_name): try: user = User.objects.get(u_name=u_name) return user except Exception as e: print(e) def check_password(self, password): return self.u_password == password
class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = ("id", "u_name", "u_password")
urlpatterns = [ url(r‘^users/‘, views.UsersAPIView.as_view()), ]
class UsersAPIView(CreateAPIView): queryset = User.objects.all() serializer_class = UserSerializer def post(self, request, *args, **kwargs): action = request.query_params.get("action") if action == "register": return self.do_register(request, *args, **kwargs) elif action == "login": return self.do_login(request, *args, **kwargs) else: raise APIException(detail="please supply correct action [register, login]") def do_register(self, request, *args, **kwargs): print(type(request)) print(type(self)) return self.create(request, *args, **kwargs) def do_login(self, request, *args, **kwargs): u_name = request.data.get("u_name") u_password = request.data.get("u_password") user = User.get_user(u_name) if not user: raise APIException(detail="用户不存在") if not user.check_password(u_password): raise APIException(detail="密码错误") token = uuid.uuid4().hex # 存token data = { "msg": "ok", "status": HTTP_200_OK, "token": token } return Response(data)
原文:https://www.cnblogs.com/zbcdamao/p/10990749.html