Django -rest-framework

出现的原因

基于django实现的APi很多功能都是自己开发,这时候djangorestframework就给我们提供了方便,直接基于它来返回数据,总之原理一样的,就是给一个接口也就是url,让前端的人请求url获取数据,在页面上显示出来,这样也达到前后端分离的效果。

认证

应用:主要用token验证 url中as_view里面调用dispatch方法
局部使用
全局使用

  • settings
#注册认证类
REST_FRAMEWORK = {
    'UNAUTHENTICATED_USER': None,
    'UNAUTHENTICATED_TOKEN': None,  #将匿名用户设置为None
    "DEFAULT_AUTHENTICATION_CLASSES": [
        "app01.utils.MyAuthentication",
    ],
}
  • 全局验证
from  rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import APIException
from app02 import models


class MyAuthentication(BaseAuthentication):
    def authenticate(self, request):
        token=request.query_params.get('token')
        print(token)
        obj=models.UserInfo.objects.filter(token=token).first()
        print(obj)
        if obj:
            return (obj.username,obj)
        raise  APIException('没有通过验证')
全局验证

权限

1,需求:Host是匿名用户和用户都能访问#匿名用户的request.user=none;User只有注册用户能访问

  • urls.py
from app03 import views
from django.conf.urls import url
urlpatterns = [
    # django rest framework
    url('^auth/', views.AuthView.as_view()),
    url(r'^hosts/', views.HostView.as_view()),
    url(r'^users/', views.UsersView.as_view()),
    url(r'^salary/', views.SalaryView.as_view()),
]
urls.py
  • 认证和权限配合使用
class SalaryView(APIView):
    '''用户能访问'''
    message ='无权访问'
    authentication_classes = [MyAuthentication,]  #验证是不是用户
    permission_classes = [MyPermission,AdminPermission,] #再看用户有没有权限,如果有权限在判断有没有管理员的权限
    def get(self,request):
        return Response('薪资列表')

    def permission_denied(self, request, message=None):
        """
        If request is not permitted, determine what kind of exception to raise.
        """
        if request.authenticators and not request.successful_authenticator:
            '''如果没有通过认证,并且权限中return False了,就会报下面的这个异常了'''
            raise exceptions.NotAuthenticated(detail='无权访问')
        raise exceptions.PermissionDenied(detail=message)
  • views
from django.shortcuts import render
from rest_framework.views import APIView  #继承的view
from rest_framework.response import  Response #友好的返回
from rest_framework.authentication import BaseAuthentication   #认证的类
from rest_framework.authentication import BasicAuthentication
from rest_framework.permissions import BasePermission
from app01 import models
from rest_framework import  exceptions
from rest_framework.permissions import AllowAny   #权限在这个类里面
from rest_framework.throttling import BaseThrottle,SimpleRateThrottle
# Create your views here.
# +++++++++++++++认证类和权限类========================
class MyAuthentication(BaseAuthentication):
    def authenticate(self, request):
        token = request.query_params.get('token')
        obj = models.UserInfo.objects.filter(token=token).first()
        if obj :  #如果认证成功,返回用户名和auth
            return (obj.username,obj)
        return None  #如果没有认证成功就不处理,进行下一步

    def authenticate_header(self, request):
        pass

class MyPermission(BasePermission):
    message = '无权访问'
    def has_permission(self,request,view):  #has_permission里面的self是view视图对象
        if request.user:
            return True  #如果不是匿名用户就说明有权限
        return False  #否则无权限

class AdminPermission(BasePermission):
    message = '无权访问'
    def has_permission(self, request, view):  # has_permission里面的self是view视图对象
        if request.user=='haiyun':
            return True  # 返回True表示有权限
        return False #返回False表示无权限

# +++++++++++++++++++++++++++
class AuthView(APIView):
    authentication_classes = []  #认证页面不需要认证

    def get(self,request):
        self.dispatch
        return '认证列表'

class HostView(APIView):
    '''需求:
          Host是匿名用户和用户都能访问  #匿名用户的request.user = none
          User只有注册用户能访问
    '''
    authentication_classes = [MyAuthentication,]
    permission_classes = []  #都能访问就没必要设置权限了
    def get(self,request):
        print(request.user)
        print(request.auth)
        print(111111)
        return Response('主机列表')

class UsersView(APIView):
    '''用户能访问,request.user里面有值'''
    authentication_classes = [MyAuthentication,]
    permission_classes = [MyPermission,AdminPermission]
    def get(self,request):
        print(request.user,'111111111')
        return Response('用户列表')

    def permission_denied(self, request, message=None):
        """
        If request is not permitted, determine what kind of exception to raise.
        """
        if request.authenticators and not request.successful_authenticator:
            '''如果没有通过认证,并且权限中return False了,就会报下面的这个异常了'''
            raise exceptions.NotAuthenticated(detail='无权访问22222')
        raise exceptions.PermissionDenied(detail=message)


class SalaryView(APIView):
    '''用户能访问'''
    message ='无权访问'
    authentication_classes = [MyAuthentication,]  #验证是不是用户
    permission_classes = [MyPermission,AdminPermission,] #再看用户有没有权限,如果有权限在判断有没有管理员的权限
    def get(self,request):
        return Response('薪资列表')

    def permission_denied(self, request, message=None):
        """
        If request is not permitted, determine what kind of exception to raise.
        """
        if request.authenticators and not request.successful_authenticator:
            '''如果没有通过认证,并且权限中return False了,就会报下面的这个异常了'''
            raise exceptions.NotAuthenticated(detail='无权访问')
        raise exceptions.PermissionDenied(detail=message)

限流

1为什么限流呢?
第一点:爬虫反爬
第二点:控制api访问次数
登录用户的用户名可以做标识
匿名用户可以参考ip,但是ip可以加代理

总结

认证:就是检查用户是否存在;如果存在返回(request.user,request.auth);不存在request.user/request.auth=NONE
权限:进行职责划分
限制访问频率

认证
    - 类:authenticate/authenticate_header ##验证不成功的时候执行的
    - 返回值:
        - return None,
        - return (user,auth),
        - raise 异常
    - 配置:
        - 视图:
            class IndexView(APIView):
                authentication_classes = [MyAuthentication,]
        - 全局:
            REST_FRAMEWORK = {
                    'UNAUTHENTICATED_USER': None,
                    'UNAUTHENTICATED_TOKEN': None,
                    "DEFAULT_AUTHENTICATION_CLASSES": [
                        # "app02.utils.MyAuthentication",
                    ],
            }

权限 
    - 类:has_permission/has_object_permission
    - 返回值: 
        - True、#有权限
        - False、#无权限
        - exceptions.PermissionDenied(detail="错误信息")  #异常自己随意,想抛就抛,错误信息自己指定
    - 配置:
        - 视图:
            class IndexView(APIView):
                permission_classes = [MyPermission,]
        - 全局:
            REST_FRAMEWORK = {
                    "DEFAULT_PERMISSION_CLASSES": [
                        # "app02.utils.MyAuthentication",
                    ],
            }
限流
    - 类:allow_request/wait PS: scope = "wdp_user"
    - 返回值:
      return True、#不限制
      return False  #限制
    - 配置: 
            - 视图: 
                class IndexView(APIView):
                    
                    throttle_classes=[AnonThrottle,UserThrottle,]
                    def get(self,request,*args,**kwargs):
                        self.dispatch
                        return Response('访问首页')
            - 全局
                REST_FRAMEWORK = {
                    "DEFAULT_THROTTLE_CLASSES":[
                    
                    ],
                    'DEFAULT_THROTTLE_RATES':{
                        'wdp_anon':'5/minute',
                        'wdp_user':'10/minute',
                    }
                }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,198评论 6 514
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,334评论 3 398
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,643评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,495评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,502评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,156评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,743评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,659评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,200评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,282评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,424评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,107评论 5 349
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,789评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,264评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,390评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,798评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,435评论 2 359

推荐阅读更多精彩内容