美文网首页
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