001---CBV和restful规范

CBV 和 restful规范

知识点准备:

django的view

  • FBV:基于函数的视图
  • CBV:基于类的视图
    urls.py
       
    from django.urls import path
    from app01.views import StudentsView
    
    urlpatterns = [
    path('students/ ',StudentsView.as_view()),
    ]
    
    views.py
    
    from django.views import View
    from django.shortcuts import HttpResponse
    
    class StudentsView(View):
    
        def get(self,request,*args,**kwargs):
            return HttpResponse('GET 请求')
    
        def post(self,request,*args,**kwargs):
            return HttpResponse('POST 请求')
    

csrf_token

  • 原理:基于中间件的process__view()做的,用户发送get请求的时候django会给他返回一个随机字符串,下次用户发送post请求的时候,要求携带这个随机字符串,验证是否一样,
  • 免除:csrf_exempt
  • 验证:csrf_protect
  • 为什么不写在process__request()里面?
    因为它中间件要判断视图函数有没有加免除或者验证的装饰器,如果在request里面,他无法获取哪些视图函数加了装饰器。
    # 第一种:给方法加
    from django.views import View
    from django.views.decorators.csrf import csrf_exempt, csrf_protect
    from django.utils.decorators import method_decorator
        
        
    class StudentsView(View):
    
        @method_decorator(csrf_exempt)
        def dispatch(self, request, *args, **kwargs):
            return super(StudentsView, self).dispatch(request, *args, **kwargs)
        
        def get(self, request, *args, **kwargs):
            
            print('GET')
            return HttpResponse('GET请求')
        
        def post(self, request, *args, **kwargs):
            return HttpResponse('POST请求')
             
    # 第二种:给类加
    @method_decorator(csrf_exempt,name='dispatch')
    class TeachersView(View):
    
        def get(self, request, *args, **kwargs):
            print('GET')
            return HttpResponse('GET请求')
        
        def post(self, request, *args, **kwargs):
            return HttpResponse('POST请求')
           

CBV源码剖析

  • FBV 和 CBV
    基于反射实现根据请求方式不同,执行不同的方法
    原理:
    • 路由 cls.as_view()-->view()-->self.dispatch()-->反射
    • 视图:get post delete put……
    • 流程
       class StudentsView(View):
    
           def dispatch(self, request, *args, **kwargs):
               # return HttpResponse('dispath')
               func = getattr(self,request.method.lower())
               return func(request, *args, **kwargs)
      
           def get(self, request, *args, **kwargs):
               return HttpResponse('GET请求')
      
           def post(self, request, *args, **kwargs):
               return HttpResponse('POST请求')
      
           def delete(self,request,*args,**kwargs):
               return HttpResponse('DELETE请求')
      
           def put(self,request,*args,**kwargs):
               return HttpResponse('PUT请求')
    
    • 继承(多个类共用的功能,避免重复编写)
       class MyBaseView(object):
           def dispatch(self, request, *args, **kwargs):
               print('before')
               func = super(MyBaseView, self).dispatch(request, *args, **kwargs)
               print('after')
               return func
    
    
       class StudentsView(MyBaseView, View):
    
           def get(self, request, *args, **kwargs):
               print('GET')
               return HttpResponse('GET请求')
      
           def post(self, request, *args, **kwargs):
               return HttpResponse('POST请求')
      
           def delete(self, request, *args, **kwargs):
               return HttpResponse('DELETE请求')
      
           def put(self, request, *args, **kwargs):
               return HttpResponse('PUT请求')
    

restful规范

十条规范

  • API与用户的通信协议:https

  • 域名:

    • URL方式:www.abc.com/api/
    • 子域名方式(存在跨域问题) :www.abc.com www.api.abc.com
  • 版本:www.abc.com/api/v1/

  • 面向资源(视网络上的任何数据为资源,均使用名词、可复数):www.abc.com/api/v1/order/

  • 过滤,通过url传递搜索条件

  • 根据method不同进行不同的操作

  from django.urls import path
  from app01.views import OrderView

  urlpatterns = [
      path('order/',OrderView.as_view()),
  ]

  class OrderView(View):
  
      def get(self, request, *args, **kwargs):
          return HttpResponse('获取订单')
  
      def post(self, request, *args, **kwargs):
          return HttpResponse('创建订单')
  
      def delete(self, request, *args, **kwargs):
          return HttpResponse('删除订单')
  
      def put(self, request, *args, **kwargs):
          return HttpResponse('更新订单')

  • 状态码
  • 错误处理
  • 返回结果
  • 返回结果中就是url

django rest_framework

  • 安装:pip install djangorestframework
  • 使用
    • 认证
          from rest_framework.views import APIView
          from rest_framework.exceptions import AuthenticationFailed
      
          class MyAuthentication(object):
      
              def authenticate(self, request):
      
                  token = request._request.GET.get('token')
                  # 可以做用户名密码验证
                  if not token:
                      raise AuthenticationFailed('认证失败')
                  return (1, 2)
          
              def authenticate_header(self, request):
                  pass
      
      
          class DogView(APIView):
              authentication_classes = [MyAuthentication]
          
              def get(self, request, *args, **kwargs):
                  return HttpResponse('获取小狗')
          
              def post(self, request, *args, **kwargs):
                  return HttpResponse('创建小狗')
          
              def delete(self, request, *args, **kwargs):
                  return HttpResponse('删除小狗')
          
              def put(self, request, *args, **kwargs):
                  return HttpResponse('更新小狗')
      
posted @ 2019-02-18 11:59  爬呀爬Xjm  阅读(207)  评论(0编辑  收藏  举报