Django Restframework.2

APIView

  • 继承自View

  • 入口函数

    • as_view

      • queryset检测

        • 不要直接操作queryset, 直接操作会发生多个请求之间的数据错乱

        • 推荐使用 all 或者 get_queryset

      • 调用父类中的as_view

        • 参数检测

        • 定义闭包函数

        • 记录数据

        • dispatch

    • dispatch

      • 重写方法

      • 做了一个Request转换(初始化)

      • 之后进行整体初始化

        • 格式化后缀

        • 内容决策

        • 版本决策

          • 强制升级

          • 推荐升级

          • 没有升级

        • 执行认证

        • 检查权限

        • 节流,限流

      • 根据请求方法进行分发

      • 如果上述处理过程中出线异常,异常并不会直接被抛,异常会被捕获

      • 提供异常策略

      • 最终对响应进行统一处理

      • 最后返回

generics

  • GenericsAPIView(最常用)

    • 继承

      • 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

mixins

  • CreateModelMixin

    • 函数

      • create

      • perform_create

      • get_success_headers

  • ListModelMixin (复数)

    • 函数

      • list

  • RetrieveModelMixin (单数)

    • 函数

      • retrieve

  • UpdateModelMixin (单数)

    • 函数

      • update

      • 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)

猜你喜欢

转载自www.cnblogs.com/zbcdamao/p/10990749.html
今日推荐