失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > rest_framework06:自动生成路由\action使用\认证

rest_framework06:自动生成路由\action使用\认证

时间:2023-08-01 10:51:59

相关推荐

rest_framework06:自动生成路由\action使用\认证

自动生成路由

# 1.导入routers模块from rest_framework import routers# 2.实例化类router=routers.SimpleRouter()# 3.注册# ('前缀','继承自ModelViewSet视图类','别名')router.register('books7',views.BooksView) # 不要加斜杠# 4.加入urlpatterns+=router.urls

action使用

装时期,给ModelViewSet的试图类,自定义函数,以及路由。

# action 用法from rest_framework.decorators import actionclass BookViewSet(ModelViewSet):queryset = Book.objects.all()serializer_class = BookModelSerializer# methods 第一个参数,传一个列表,列表中放请求方式# ‘/books/get_1’ 是请求地址。books是ModelViewSet 注册的路由# detal:True是, 带pk ,即/books/1/get_1@action(methods=['GET','POST'],detail=False)def get_1(self,request):book=self.get_queryset()[:2]ser=self.get_serializer(book,many=True)return Response(ser.data)

认证

局部认证

1.新写认证类

from rest_framework.authentication import BaseAuthenticationfrom rest_framework.exceptions import AuthenticationFailedfrom app01.models import UserTokenclass MyAuthentication(BaseAuthentication):def authenticate(self, request):# 认证逻辑, 如果认证通过,返回两个值# 如果认证失败,抛出AuthenticationFailed异常token=request.GET.get('token')if token:user_token=UserToken.objects.filter(token=token).first()if user_token:return user_token.user,tokenelse:raise AuthenticationFailed('认证失败')else:raise AuthenticationFailed('请求地址需要带token')

2.认证逻辑,如使用token,数据库储存。

models.py

class User(models.Model):username=models.CharField(max_length=32)password=models.CharField(max_length=32)user_type=models.IntegerField(choices=((1,'超级用户'),(2,'普通用户'),(3,'二笔用户')))class UserToken(models.Model):token=models.CharField(max_length=64)user=models.OneToOneField(to=User,on_delete=models.CASCADE)

views.py

登录功能

# 认证功能from app01 import modelsimport uuidclass LoginView(APIView):def post(self,request):myRespone=MyResponse()username=request.data.get('username')password=request.data.get('password')print(username,password)user=models.User.objects.filter(username=username,password=password).first()if user:# 登陆成功,生成一个随机及付出token=uuid.uuid4()# 查询,没有就新增models.UserToken.objects.update_or_create(defaults={'token':token},user=user)myRespone.msg='登陆成功'myRespone.token=tokenelse:myRespone.status=101myRespone.msg='用户名或密码错误'return Response(myRespone.get_dic)

视图类

增加authentication_classes

from rest_framework.viewsets import ViewSetMixinfrom app01.app_auth import MyAuthentication# ViewSetMixin一定放在前面,重写as_view方法class Books6View(ViewSetMixin,GenericAPIView):authentication_classes = [MyAuthentication]def get_all_book(self,request):books = Book.objects.all()book_ser = BookSerializer(books, many=True)return Response(book_ser.data)

全局认证

settings.py

REST_FRAMEWORK={"DEFAULT_AUTHENTICATION_CLASSES":["app01.app_auth.MyAuthentication",]}

登录视图类需要排除认证,在类里写空列表

authentication_classes = []

如果觉得《rest_framework06:自动生成路由\action使用\认证》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。