美文网首页
django rest-framework part1

django rest-framework part1

作者: Fizz翊 | 来源:发表于2018-11-08 23:45 被阅读15次

    1 FBV和CBV

    FBV (function base views 基于函数的视图) 在视图里时候用函数请求处理,最开始使用的方法

    url(r'^admin/',admin.函数名)
    

    在views.py中定义函数来处理用户请求,函数中在定义请求方法的不同进行不同的处理。

    CBV(class base views 基于类的视图) 在视图里使用类处理请求

    ulr(r'^login',views.类名.as_view())
    ************
    from django.views import View
    class 类名(View):
    

    在类中我们定义的get/post方法的名字不是我们自己定义的,而是按照固定的样式。

    原理:

    路由   url -> view方法 -> dispatch方法(反射执行其他:GET/POST/ 
    

    2django中间件

    • Process_request
    • 路由匹配
    • Process_ view
    • 视图函数
    • 如果报错
    • process_exception
    • 如果有render
    • Process_render_template
    • 结束
    • process_response

    中间件做过什么

    • 权限控制

    • 用户登录验证

    • django的csrf的实现(位于process_view)中 @csrf_exempt 免除csrf验证

      在process_view 中判断视图是否被@csrf_exempt装饰

      去请求体或者cookie中获取token ,然后校验

      如果在setting中csrf中间件被注释,但是少量的视图需要用csrf中间件,可以使用装饰器@csrf_protect

      在FBV中装饰器直接写在需要这个功能的视图前面就行,但是在CBV中直接写无效

    CBV写法:

    class StudentsView(View):
        @menthod_decorator(csrf_exempt)
        def dispatch(self,request,*args,**kwargs):
            return super(StudentsView,self).dispatch(request,*args,**kwargs)
        
        def get(self,request,*args,**kwargs):
            pass
        def post(self,request,*args,**kwargs):
            pass
        def put(self,request,*args,**kwargs):
            pass
        def delete(self,request,*args,**kwargs):
            pass
    

    或者是

    @method_decorator(csrf_exempt,name='dispatch')
    class StudentsView(View):
        
        def get(self,request,*args,**kwargs):
            pass
        def post(self,request,*args,**kwargs):
            pass
        def put(self,request,*args,**kwargs):
            pass
        def delete(self,request,*args,**kwargs):
            pass
    

    3 restfui规范

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

      url = (r'^order/',views.order)
      ****************
      def order(request):
        if request.method =='GET':
            pass
        elif request.method == 'POST':
            pass
      

      CBV:

      url = (r'^order/',views.OrderView.as_view())
      *************
      class OrderView(View):
        def get(self,request,*args,**kwargs):
            pass
        def post(self,request,*args,**kwargs):
            pass
        def put(self,request,*args,**kwargs):
            pass
        def delete(self,request,*args,**kwargs):
            pass
      
    • 通信协议建议使用https 浏览器携带SSL证书

    • api专用域名 https://api.xxxxx(会存在跨域问题) https://xxx.api

    • 版本 https://api.xxx.com/v1/

    • 路径 视网络上任何东西都是资源,均使用名词表示

    • 过滤 通过在url上传参的形式传递搜索

    • 错误处理 状态码是4XX时,应返回错误信息,error当做key

      {
          error:"Invalid API key"
      }
      
    • 返回结果

    4 rest framework框架

    认证

    问题:有些api需要用户登录之后才能访问

    Student.object.update_or_create(user=obj,defaults={'字段':更新的值})
    

    存在就更新 不存在就创建

    解决:

    a.创建两张表
    
    b.用户登录(返回token并保存到数据库)
    
    c 认证流程原理
    
    d 局部使用和全局使用
    
    e 内部自带的验证方法
    
        1认证类,必须继承 from rest_framework.authentication import BaseAuthentication
    

    认证方法:

    from rest_framework import exceptions
    
    class FirstAuthtication(BaseAuthentication):
        def authenticate(self,request):
            pass
    
        def authenticate_header(self,request):
            pass
    
    class Authtication(BaseAuthentication):
        def authenticate(self,request):
            #获取token
            token = request._request.GET.get('token').first()
            #如果没有传递token
            if not token:
                raise exceptions.AuthenticationFailed('用户验证失败')
            return (token.usr,token)
    
        def authenticate_header(self,request):
            pass
    

    单个视图使用

    #在视图开始添加
    authentication_classes = [Authtication,]
    

    全局使用

    Setttings.py

    REST_FRAMEWORK = {
        "DEFAULT_AUTHENTICATION_CLASSES": ['utiles.auth.FirstAuthtication', 'utiles.auth.Authtication']
    }
    

    如果在全局使用时某个视图不需要验证就在视图函数的开始添加

    authentication_classes = [ ]
    

    返回值

    • None 进行下一个认证
    • raise exceptions.AuthenticationFailed('用户验证失败') 抛出异常
    • (元素1,元素2 ) 元素1赋值给request.user 元素2赋值给request.auth

    源码流程

    • Dispatch
      • 封装request self.initialize_request(request, *args, **kwargs)
        • 获取定义的认证类(全局/局部),通过列表生成创建对象
      • inital
        • Perform_authentication
          • Request.user(内部循环)

    权限

    权限方法

    from rest_framework.permissions import BasePermission
    class MyPermission(BasePermission):
        def has_premission(self,request,view):
            if request.user.user_type != 3:
                return False
            return True
        
    class OrderView(APIView):
        peimission_classes = [MyPermission,]
        
        def get(self,request,*args,**kwargs):
            pass
        
    

    源码流程:

    • dispatch
      • 封装request
    • initial
      • Check_permissions()
        • Get_permissions() 循环得到对应的权限对象
        • 内部循环权限对象的has_permission()方法

    全局方法

    Settings.py中设置

    REST_FRAMEWORK = {
        "DEFAULT_PERMISSON_CLASSES":['utiles.auth.MyPermission']
    }
    

    如果在全局使用时某个视图不需要权限就在视图函数的开始添加

    peimission_classes = []
    

    局部方法 在指定的视图中间添加peimission

    class OrderView(APIView):
        peimission_classes = [MyPermission,]
        
        def get(self,request,*args,**kwargs):
            pass
    

    节流(访问评率控制)

    版本

    相关文章

      网友评论

          本文标题:django rest-framework part1

          本文链接:https://www.haomeiwen.com/subject/fpagxqtx.html