1、认证
1.1基本使用
1
2
3
4
5
6
7 -第一步:写一个认证类,继承BaseAuthentication,重写authenticate 方法
8 -第二步:在 authenticate 方法中判断用户是否登录(取出用户携带的token,去判断)
9 -第三步:如果认证通过,返回两个值,如果认证不通过抛异常
10 -
11 -第四步:把写的认证类,配置在视图类中(跟请求和响应的配置一样),全局配置
12
13
14
15
16 -鸭子类型:不显示的继承某个类,只要类中有共同的属性和方法,我们就属于同一类
1.2登录功能
1
2
3from rest_framework.viewsets import ViewSet
4
5class Login(ViewSet):
6 authentication_classes = []
7
8 @action(methods=['POST'], detail=False)
9
10 def login(self, requset):
11 username = requset.data.get('username')
12 password = requset.data.get('password')
13 user = models.UserInfo.objects.filter(username=username, password=password).first()
14 if user:
15 token = uuid.uuid4()
16 models.UserToken.objects.update_or_create(defaults={'token': token}, user=user)
17
18 return Response({'code': 200, 'msg': '登陆成功', 'token': token})
19 else:
20 return Response({'code': 201, 'msg': '用户名或密码错误'})
21
22
23class UserInfo(models.Model):
24 username = models.CharField(max_length=8)
25 password = models.CharField(max_length=8)
26
27
28class UserToken(models.Model):
29 token = models.CharField(max_length=32)
30 user = models.OneToOneField(to='UserInfo',on_delete=models.CASCADE)
31
32
33
34
35from django.urls import path,include
36from rest_framework.routers import SimpleRouter
37from app01 import views
38
39
40routes = SimpleRouter()
41routes.register('user',views.Login,'login')
42
43urlpatterns = [
44 path('admin/', admin.site.urls),
45 path('', include(routes.urls)),
46]
1.2认证功能代码
1-第一步:写一个认证类,继承BaseAuthentication,重写authenticate 方法
2
3from rest_framework.authentication import BaseAuthentication
4from app01 import models
5from rest_framework.exceptions import AuthenticationFailed
6
7
8class BookAuth(BaseAuthentication):
9 def authenticate(self, request):
10 -第二步:在 authenticate 方法中判断用户是否登录(取出用户携带的token,去判断)
11
12
13 mytoken = request.META.get('HTTP_TOKEN')
14 user_token = models.UserToken.objects.filter(token=mytoken).first()
15 if user_token:
16 -第三步:如果认证通过,返回两个值,如果认证不通过抛异常
17 -
18 return user_token.user, mytoken
19 else:
20 raise AuthenticationFailed('请先登录')
21
22
23-第四步:把写的认证类,配置在视图类中(跟请求和响应的配置一样),全局配置
24
25REST_FRAMEWORK = {
26 'DEFAULT_AUTHENTICATION_CLASSES': ['app01.auth.BookAuth']
27
28}
29
30
31authentication_classes = [BookAuth]
32
33优先级:局部>全局>默认
34'''
35在后续的request对象中,可以通过request.user获取当前用户对象,request.auth获取token值
36'''
2、权限
1
2 -第一步:写一个认证类,继承BaseAuthentication,重写authenticate 方法
3 -第二步:在 authenticate 方法中判断用户是否登录(取出用户携带的token,去判断)
4 -第三步:如果认证通过,返回两个值,如果认证不通过抛异常
5 -
6 -第四步:把写的认证类,配置在视图类中(跟请求和响应的配置一样),全局配置
7
8
9 可以给不同用户开设访问权限
10from rest_framework.permissions import BasePermission
11
12
13class BookPermission(BasePermission):
14 def has_permission(self, request, view):
15 permiss_type = request.user.permiss_type
16 if permiss_type in [2]:
17 return True
18 else:
19 return False
20
21
22
23class Book1Permission(BasePermission):
24 def has_permission(self, request, view):
25 permiss_type = request.user.permiss_type
26 if permiss_type in [1,2]:
27 return True
28 else:
29 return False
30
31
32
33 'DEFAULT_PERMISSION_CLASSES': ['app01.auth.BookPermission'],
34
35 permission_classes = [Book1Permission]
3、频率
1
2获取ip或者用户
3request.META.get("REMOTE_ADDR")
4request.user.id
5
6from rest_framework.throttling import SimpleRateThrottle
7class BookThrot(SimpleRateThrottle):
8 scope = 'myscope'
9 def get_cache_key(self, request, view):
10
11 return request.META.get('REMOTE_ADDR')
12
13
14'DEFAULT_THROTTLE_RATES': {
15 'myscope': '3/m',
16 },
17 'DEFAULT_THROTTLE_CLASSES': ['app01.auth.BookThrot'],
18
19 throttle_classes = []