drf 五

目录

1.登录接口
2.认证类
3.权限类
4.频率类

1.认证类前奏登录功能,认证类编写

1 认证类的使用流程
    -写一个类,继承BaseAuthentication
    -在类中写authenticate(self, request):
    -在方法中进行校验,如果校验通过,返回两个值(返回空)
    -使用认证类,在视图类上加
    authentication_classes = [LoginAuth,]

1.1 先写两个表

##models.py
class User(models.Model):
    name = models.CharField(max_length=32)
    password = models.CharField(max_length=32)
    user_type = models.IntegerField(choices=((1, '超级管理员'), (2, '普通用户'), (3, '超级普通用户')))


class UserToken(models.Model):
    user = models.OneToOneField(to='User',on_delete=models.CASCADE)
    token=models.CharField(max_length=32)

1.2 登录视图类

from rest_framework.viewsets import ViewSetMixin
from rest_framework.generics import ListAPIView, CreateAPIView
from app01 import models
from app01 import serializer
from rest_framework.decorators import action
from app01.response import APIResponse
import uuid
from app01.auth import LoginAuth

# 基于自己写的UserToken表版
class UserViews(ViewSetMixin, CreateAPIView):
    queryset = models.User.objects.all()
    serializer_class = serializer.UserSerializers

    @action(methods=['POST'], detail=False)
     def login(self, request):
       name = request.data.get('name')
       password = request.data.get('password')
       user = models.User.objects.filter(name=name, password=password).first()
       token = uuid.uuid4()  # 生成一个uuid的随机字符串
       # 这个是错误的:user.usertoken是None
       # user.usertoken.user=user
       # user.usertoken.token=token
       # 如果每次都是新增,如果它登录过,这个地方会报错
       # models.UserToken.objects.create(user=user,token=token)
       # 如果有就更新,如果没有就创建
       # 根据user去查询,如果能查到,就修改token,如果查不到,就新增一条
       models.UserToken.objects.update_or_create(defaults={'token': token}, user=user)
       if user:
           return APIResponse(msg='登录成功', token=token)
       else:
           return APIResponse(status=101, msg='用户名或密码错误')

1.3 路由

from django.urls import path, include
from app01 import views
from rest_framework.routers import SimpleRouter

router = SimpleRouter()
router.register('user', views.UserView)

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include(router.urls)),
]

2.认证类

2.1 认证类的编写

###基于自己写的UserToken表
from rest_framework.exceptions import AuthenticationFailed
from app01 import models
from rest_framework.authentication import BaseAuthentication

class LoginAuth(BaseAuthentication):
    def authenticate(self, request):
        token = request.GET.get('token')
        user_token = models.UserToken.objects.filter(token=token).first()
        if user_token:
        # 登录了
        #返回两个值,第一个值,给了新的request对象的user属性,通常情况我们把当前登录用户给它
            return user_token.user, ''
        else:
            raise AuthenticationFailed('没有登陆')

2.2 使用认证类(全局用,局部用)

#全局用,setting中配置(所有接口都需要认证)
REST_FRAMEWORK={
    "DEFAULT_AUTHENTICATION_CLASSES":["app01.auth.LoginAuth",]
}
# 登录功能需要局部禁用,在视图类中加入
    authentication_classes = []
    
#只在局部使用,只在视图类中加
authentication_classes = [LoginAuth,]

3.权限类

3.1 编些权限类

from app01 import models
from rest_framework.permissions import BasePermission

class MyPermission(BasePermission):
    message='你没有权限'
    def has_permission(self, request, view):
        if request.user.user_type == 1:

            return True
        else:
            self.message='你是%s用户,你没有权限'%request.user.get_user_type_display()
            return False

3.2 权限类的使用

# 局部使用(在视图类中加)
permission_classes = [MyPermission,]
# 全局使用(在配置文件中配置)
REST_FRAMEWORK={
    "DEFAULT_PERMISSION_CLASSES":["app01.auth.MyPermission",],
}

4.频率类

4.1 定义一个频率类

from rest_framework.throttling import BaseThrottle, SimpleRateThrottle
class MyThrottle(SimpleRateThrottle):
    scope = 'ip_th'
    def get_cache_key(self, request, view):
        return self.get_ident(request)

4.2 局部使用,全局使用

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

推荐阅读更多精彩内容

  • 代码使用 utils.throttle 局部使用 全局使用 以上是最基本的自定义 rest_framework中内...
    上帝大人阅读 429评论 0 1
  • 节流 作用: 节流(Throttling)类似于权限,因为它决定了是否应该对请求进行授权。节流表示一个临时状态,并...
    迷路了吗_67f1阅读 251评论 0 0
  • 认证 作用,检测用户是否登录 在视图类中配置 authentication_classes = [] 这是一个列表...
    时光清浅_许你心安_阅读 937评论 0 0
  • 新建子应用home 因为接下来的功能中需要使用到登陆功能,使用django内置admin站点并创建一个管理员. 创...
    childhood_1013阅读 181评论 0 0
  • 今天来总结一下学习的drf生成接口,支持哪些功能了?总结一下:认证、限流、过滤查询、排序、分页第一个就是认证了,就...
    让我伤心的玫瑰阅读 299评论 0 0