• 视图组件和认证组件


    1.使用mixin和generics类编写视图 

    from
    rest_framework.mixins import CreateModelMixin, ListModelMixin, DestroyModelMixin, RetrieveModelMixin, UpdateModelMixin from rest_framework.generics import GenericAPIView class BooksView(CreateModelMixin, ListModelMixin, GenericAPIView): serializer_class = BookSerializer queryset = models.Book.objects.all() def get(self, request, *args, **kwargs): return self.list(request, *args, **kwargs) def post(self, request, *args, **kwargs): return self.create(request, *args, **kwargs) class BookView(UpdateModelMixin, DestroyModelMixin, RetrieveModelMixin, GenericAPIView): serializer_class = BookSerializer queryset = models.Book.objects.all() def get(self, request, *args, **kwargs): return self.retrieve(request, *args, **kwargs) def put(self, request, *args, **kwargs): return self.update(request, *args, **kwargs) def delete(self, request, *args, **kwargs): return self.destroy(request, *args, **kwargs)

    2.使用generics 下ListCreateAPIView,RetrieveUpdateDestroyAPIView 编写视图

    from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView
    
    
    class BooksView(ListCreateAPIView):
        queryset = models.Book.objects.all()
        serializer_class = BookSerializer
    
    
    class BookView(RetrieveUpdateDestroyAPIView):
        queryset = models.Book.objects.all()
        serializer_class = BookSerializer

    3. 使用ModelViewSet 编写视图

    url配置:
    url(r'^books/(?P<pk>d+)', views.BooksView.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),
    url(r'^books/$', views.BooksView.as_view({'get': 'list', 'post': 'create'})),
    views层:
    # 使用ModelViewSet
    from rest_framework.viewsets import ModelViewSet
    
    class BooksView(ModelViewSet):
        queryset = models.Book.objects.all()
        serializer_class = BookSerializer

    4.ViewSetMixin的使用

    url 配置
     url(r'^test/', views.Publish.as_view({
            'get': 'get_all', 'post': 'create_one', 'put': 'update', 'delete': 'delete'
        })),
    
    views:
    from rest_framework.viewsets import ViewSetMixin
    
    
    class Publish(ViewSetMixin, APIView):
        def get_all(self, request):
            return HttpResponse('get_all')
    
        def create_one(self, request):
            return HttpResponse('create_one')
    
        def update(self, request):
            return HttpResponse('update')
    
        def delete(self, request):
            return HttpResponse('delete')

    5. 认证组件

    drf认证组件源码实现
    '''
    1: APIView的dispach方法 2.self.initial(request, *args, **kwargs)方法 3. self.perform_authentication(request)[认证] 4.def perform_authentication(self, request) 5. request.user-> Request(request为dispach中替换过的新的request) 6.Request中找到user 7.self._authenticate()[self是新的request对象] 8.Request类的_authenticate(self)方法,深度 '''
    from rest_framework.views import APIView
    from rest_framework.exceptions import AuthenticationFailed
    import uuid
    from rest_framework.request import Request
    
    
    class CheckLogin():
        def authenticate(self, request):
            token = request.GET.get('token')
            ret = models.UserToken.objects.filter(token=token).first()
            if ret:
                return None
            else:
                raise AuthenticationFailed('验证失败')
    
        def authenticate_header(self, request):
            pass
    
    
    class BooksView(APIView):
        authentication_classes = [CheckLogin]
    
        def get(self, request):
            return HttpResponse('ok')
    
    
    class Login(APIView):
        def post(self, request):
            response = {
                'status': 100,
                'msg': None
            }
            name = request.data.get('name')
            pwd = request.data.get('pwd')
            # 数据库校验该用户是否存在
            user = models.User.objects.filter(name=name, pwd=pwd).first()
            if user:
                # 正常返回登录成功, 返回唯一token
                token = uuid.uuid4()
                ret = models.UserToken.objects.update_or_create(user=user, defaults={'token': token})
                response['msg'] = '登录成功'
                response['token'] = token
            else:
                response['msg'] = '登录失败'
                response['status'] = 101
            return Response(response)
    学习,学习,学习! 学习是为了更好的未来,不要让别人瞧不起你,加油!!!
  • 相关阅读:
    Source not found for GeneratedMethodAccessor127.invoke(Object, Object[]) line: not available
    Common Lisp学习资源整理
    安装lispbox出现:error while loading shared libraries: libjpeg.so.62: cannot open shared object file: No such file or directory
    《完全用Linux工作》作者:王垠
    记一次奇怪的电脑故障
    Linux下修改键盘映射
    百度与谷歌的差别,英文检索的重要性
    你今天的习惯决定了你将来的位置
    Coursera上一个不错的Java课
    无限制使用ppt转pdf功能
  • 原文地址:https://www.cnblogs.com/yangyufeng/p/10610523.html
Copyright © 2020-2023  润新知