DRF 认证,权限,节流,版本,解析器的基本使用

认证,权限

认证和权限一般都是一块使用的他的意识是重字面上理解很简答他的意识就是!访问一些接口的内容需经过认证才可以访问那么权限呢就是相当于我们普通用户和VIP用户了这个就是简单的认证,权限的简单理解了!那么至于这么去实现这个功能!下面代码有详细的解释!

#这里就是我们要导入一些我们要用到的包
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from authapp.models import UserToken

class MyOrderAuthentication(BaseAuthentication):
    """
       在这里实现认证的逻辑
    """
    def authenticate(self, request):
        #这里就是获取到我们的token
        #至于token哪里来的就是经过登录后随机产生出一个字符串
        token = request._request.GET.get('token')
        # 获取到token之后,需要在数据库中查找token
        obj = UserToken.objects.filter(token=token).first()
        if not obj:
            # 没有通过认证
            raise AuthenticationFailed('认证失败')
        # 返回元组( user, auth )
        return (obj.user, obj)
        #那么他返回的是个什么东西呢obj.user返回的就是我们用户,
        #那么这个obj呢就是我的这个token了

下面我们说一下权限的具体实现功能

#日常导包我们就不说了
from rest_framework.permissions import BasePermission

class MyOrderPermission(BasePermission):
    """自定义权限认证的类,必须要实现has_permission方法"""
    message = '你不是超级用户,没有权限访问'
    def has_permission(self, request, view):
        """
        Return `True` if permission is granted, `False` otherwise.
        返回True表示有权限访问,返回False表示没有权限访问
        """
        #这个判断他会去获取我们的之前在注册的时候输入的这个用
        # 户类型(1,‘普通用户’,2’VIP用户‘)他拿到后会去执行
        #下面的判断
        if request.user.user_type != 2:
            return False
        return True
      #如多判断成立的话他就会return False 反之就是return True
      #就可以拿到我们需要的数据了!

节流

上面呢我们说道了认证和权限现在我们来说节流想!

节流重字面上理解节约的意思是吧!那么我们这个DRF上的节流是什么意识它的意识也很简单就是通俗的来说就是反爬虫的一些手段那么至于这么去实现这个功能呢!下面的代码会有详细的注释!

class VisitThrottle(BaseThrottle):
    def __init__(self):
        self.history = None

    def allow_request(self,request,view):
        """实现节流的逻辑"""
        
        ip_address = self.get_ident(request)
        ctime = time.time()
        if ip_address not in VISIT_RECORD:
            #第一次访问的时候将访问的时间存储在字典中(ip地址为Key,访问的时间为value值)
            VISIT_RECORD[ip_address] = [ctime,]
#
        #第二次访问的时候取出访问的历史记录
        history = VISIT_RECORD[ip_address]

        # 基于用户的节流
         username = request.user.username
         if username not in VISIT_RECORD:
             VISIT_RECORD[username] = [ctime, ]
         history = VISIT_RECORD[username]
        self.history = history

        while history and history[-1] < ctime - 10:
            """如果访问的时间记录超过60秒,就把超过60秒的时间记录移除"""
            history.pop()

        if len(history) < 6:
            history.insert(0,ctime)
            return True

        return False

    def wait(self):
        """一旦用户访问次数到达阀值,显示用户需要等待的时间"""
        ctime = time.time()
                      #09:54:30    09:54:28
        return 10 - (ctime - self.history[-1])

class VisitThrottle(SimpleRateThrottle):
    #没有登录用户,每分钟访问10次
    scope = 'unlogin'
    def get_cache_key(self, request, view):
        return self.get_ident(request)

版本

在字面上来看就是一代一代升级了那么版本在这里面的意识就是我们每开发一条api他都是有他的版本已好区分!

 class ParmasVersion(object):
            def determine_version(self, request, *args, **kwargs):
            version = request.query_params.get('version')
            return version

    #这下面就是一些版本设置的问题
    'VERSION_PARAM':'version',
    #如果没有版本默认为v1
    'DEFAULT_VERSION':'v1',
    #版本规定只能有v1, or v2
    'ALLOWED_VERSIONS':['v1','v2'],

 versioning_class = URLPathVersioning

 url 规则 (?P < version > [v1 | v2] +) 

 print(request.versioning_scheme.reverse(viewname='api:user', request=request))  这里可以通过request.versioning_scheme.reverse 进行url 反向解析
 >> http: // 127.0.0.1: 8000 / api / v2 / user /

解析器


    1 请求头中 Content-Type : application/x-www-form-urlencoded,
    2 数据格式: name=alex&age=18

   request.POST 中才有值

    比如 form 表单提交 满足 1,2

        ajax 提交的时候也是默认 1,2 条件
    

    当然可以定义 ajax 发送的请求头和数据格式:
        headers:{'Content-Type':'application/json'}
        data:JSONstringfy({name:'aaa',age:12})
    
        这时候 后台 request.POST 中不再有数据
              可以从 request.BODY 中获取数据
        注意:只有使用 request.data的时候,parser对象才调用

        #如果客户端的Content-Type的值和 application/json 匹配:JSONParser处理数据
        #如果客户端的Content-Type的值和 application/x-www-form-urlencoded 匹配:FormParser处理数据

1 获取用户的请求
2 获取用户的请求体
3 根据用户的请求头 和 parser_classes 中支持的 parser 进行比较
4 parser对象 去请求
5 request.data



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

推荐阅读更多精彩内容

  • 阿兵大我三岁,阿芳大我两岁,但他们奔赴广东时我却还趴在地上弹玻璃球。 那时我还小,只得花鸟鱼虫,不记爱情和自由。关...
    忘佯阅读 487评论 1 5
  • 喜欢上一个不可能的人是什么感觉?大概就像是喜欢上一面湖水。你只能从她的眼睛里看着自己,而她却好像永远都那么深邃,遥...
    随心所属阅读 735评论 10 10
  • 若不是,昨夜的风声摇落了桂花蕾一丝痛,依着心墙微微溢出,墨吟的染执意唤醒 过往忧伤踏碎了 ,被风穿过的走廊怎么会,...
    陈碧华阅读 1,105评论 35 45