restframwork组件的权限认证
在一个视图类下重写 authentication_classes = [TokenAuth,]然后去认证类TokenAuth里面实现认证逻辑代码
认证类代码块:
1 class TokenAuth(BaseAuthentication):
2 def authenticate(self,request):
3 token=request.GET.get("token")
4 token_obj=Token.objects.filter(token=token).first()
5 if not token_obj:
6 raise exceptions.AuthenticationFailed("用户验证失败,500")
7 else:
8 return token_obj.user,token_obj.token
可以继承基类object,但是需要重写两个方法authenticate和authenticate_header
from rest_framework.authentication import BaseAuthentication 导入模板类便于继承
直接继承 BaseAuthentication 可以只重写前面一个
视图类代码块:
1 class BookShow(viewsets.ModelViewSet):
2 authentication_classes = [TokenAuth,]
3
4 queryset = Book.objects.all()
5 serializer_class = BookModelSerializers
6 def list(self, request, *args, **kwargs):
7 print(request.user)
8 print(request.auth)
9 book_list=Book.objects.all()
10 bs=BookModelSerializers(book_list,many=True,context={"request":request})
11 return Response(bs.data)
若想在全局实现认证或者权限:
需要在settings下去配置REST_FRAMEWORK参数:
1 REST_FRAMEWORK={
2 "DEFAULT_AUTHENTICATION_CLASSES" : ["apk.utils.TokenAuth",], #认证组件
3 "DEFAULT_PERMISSION_CLASSES":["apk.utils.Permess"] #权限组件
4 }
上面的apk.utils.TokenAuth 对应的就是自定义的认证组件类 apk.utils.Permess 以及权限组件类
组件的具体实现逻辑:
1 from rest_framework import exceptions
2 from rest_framework.authentication import BaseAuthentication
3 from .models import *
4
5 class TokenAuth(BaseAuthentication):
6 def authenticate(self, request):
7 token=request.GET.get("token")
8 token_obj=Token.objects.filter(token=token).first()
9 if not token_obj:
10 raise exceptions.AuthenticationFailed("用户认证失败,500")
11 else:
12 return token_obj.user,token_obj.token
13
14
15 class Permess(object):
16 message="权限不够,请联系管理员!" #定义未通过验证时的提示属性
17 def has_permission(self,request,exam):
18 user=request.user
19 type=User.objects.filter(user=user).first().user_type
20 if type==3:
21 return True
22 else:
23 return False
完成上述配置后,则全局下的所有表都需要认证和权限通过才可以访问了
需要注意的是标红部分的方法名为配置名,不可改变
部分不希望认证的数据表可以直接重写类下的配置:
# authentication_classes = []
# permission_classes = []
*****************************************************
关于解析器:
默认rest_framework里面支持的常用解析器有三个 JSONParse FormParse MultiPartParser
可以通过parser_classes=[JSONParse,]去指定使用哪个解析器去解析数据
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
对应url的封装:
把之前手动写的url链接地址更换成它集成的四条url链接
from django.conf.urls import url,include
from rest_framework import routers
routers=routers.DefaultRouter() #实例化一个注册类工具对象
routers.register("books",views.BookShow) #将要对应的url和视图类 进行关联
在urlpatterns里面进行加入
1 urlpatterns = [
2
3 url(r'',include(routers.urls)),
4
5 ]
就可以实现url的访问了