django rest-framework part1

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

节流(访问评率控制)

版本

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容

  • Web框架之Django: (1)简介: Django是一个由Python写成开源的重量级Web应用框架,采用MT...
    老肖阅读 3,046评论 0 18
  • Django: csrf防御机制 csrf攻击过程 1.用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登...
    lijun_m阅读 1,055评论 0 0
  • 经过对django的初步学习,我们已经对后台的基本流程以及django的运作有了一定的了解,但是这还不足够,dja...
    coder_ben阅读 3,827评论 8 34
  • Api 接口 高山山书写例子 resources.py#!coding=utf-8import jsonfrom ...
    入间阅读 402评论 0 0
  • Refer to: www.threemeal.com/blog/12/ 中间件 中间件是一个钩子框架,它们可以介...
    兰山小亭阅读 16,475评论 9 165