设为首页 加入收藏

TOP

drf 认证组件、权限组件、频率组件(一)
2023-07-25 21:25:42 】 浏览:66
Tags:drf

认证组件

访问某个接口 需要登陆后才能访问 

#第一步 写一个登录功能 用户表
	User表
    UserToken表 :存储用户登录状态 【这个表可以没有 如果没有 把字段直接卸载User表上也可以】

登录接口

model.py

class Books(models.Model):
    name = models.CharField(max_length=32)
    price = models.CharField(max_length=32)
    publish = models.ForeignKey(to='Publish',on_delete=models.CASCADE)
    authors = models.ManyToManyField(to='Authors')

    def publish_dict(self):
        return {'name':self.publish.name,'addr':self.publish.addr}

    def author_list(self):
        l = []
        for author in self.authors.all():
            l.append({'name':author.name,'phone':author.phone})
        return l

class Publish(models.Model):
    name = models.CharField(max_length=32)
    addr = models.CharField(max_length=32)

class Authors(models.Model):
    name = models.CharField(max_length=32)
    phone = models.CharField(max_length=32)

class User(models.Model):
    username = models.CharField(max_length=32)
    password = models.IntegerField()

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

url.py

router = SimpleRouter()
router.register('user',views.UserView,'user')
urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/v1/', include(router.urls))
]

views.py

import uuid
from django.shortcuts import render
from .models import User, UserToken
from rest_framework.viewsets import ModelViewSet,ViewSet
from rest_framework.decorators import action
from rest_framework.response import Response


# Create your views here.

class UserView(ViewSet):
    @action(methods=['POST'], detail=False)
    def login(self, request):
        username = request.data.get('username')
        password = request.data.get('password')
        user = User.objects.filter(username=username, password=password).first()
        if user:
            token = str(uuid.uuid4())
           #用户登陆成功随机生成一个用不重复的字符串 
        	#在Usertoken表中存储一下 :1 从来没有登陆过 插入一条 2登陆过 修改记录
        UserToken.objects.update_or_create(user=user, defaults={'token': token})
            #如果有就修改 没有就新增 
            #kwargs 传入的东西查找 能找到 使用defaults的更新 否则新增一条
            return Response({'code': 100, 'msg': '登陆成功', 'token': token})
        else:
            return Response({'code': 101, 'msg': '用户名或密码错误'})
    
'''
以后 有的接口组要登录后才能访问 有的接口不登陆就能访问(查询所有不需要登录就能访问 查询单个 需要登陆才能访问)
	登录认证的限制
	
写登录接口 返回token 以后只要带着token过来 就是登陆了 不带就是没有登陆
'''

认证组件使用

# 查询所有不需要登录就能访问
# 查询单个,需要登录才能访问
# 在查询单个个视图类中写authentication_classes=[]

1.写一个认证类 需要继承BaseAuthentication

from rest_framework.authentication import BaseAuthentication

image

2.通过看源码分析 必须重写authenticate方法 在该方法中实现登录认证

3.如果认证成功 返回两个值【登录用户和token或None】

4.认证不通过 抛异常

from rest_framework.exceptions import AuthenticationFailed

5.局部使用和全局使用

局部:只在某视图类中使用【当前视图类管理的所有接口均使用过】

class BookView(ViewSetMixin,RetrieveAPIView):
    queryset = Books.objects.all()
    serializer_class = BooksSerializers
    authentication_classes = [LoginAuth]
    '''登录以后才能查询单个书信息'''

全局:全部接口都生效(登录接口不需要)

REST_FRAMEWORK={
'DEFAULT_AUTHENTICATION_CLASSES': ['app01.authentication.LoginAuth']
}
'''
所有接口都需要认证 登陆不能验证 局部禁用
'''

局部禁用:

class UserView(ViewSet):
    authentication_classes = [] 

view.py

#查所有
class BooksView(ViewSetMixin,ListAPIView):
    queryset = Books.objects.all()
    serializer_class = BooksSerializers

#查单个
class BookView(ViewSetMixin,RetrieveAPIView):
    queryset = Books.objects.all()
    serializer_class = BooksSerializers
    authentication_
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇吾爱破解 2023 春节解题领红包之 .. 下一篇Python 内置界面开发框架 Tkinter..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目