1、在对应的视图函数里增加认证(局部起作用,不全局生效)
导入类:
from rest_framework.authentication import (
BasicAuthentication,
SessionAuthentication,
)
from rest_framework.permissions import IsAuthenticated, AllowAny
2、基于第八节内容增加以下内容
authentication_classes = [SessionAuthentication]
permission_classes = [IsAuthenticated]
3、完整code
from django.shortcuts import render, HttpResponse
from rest_framework.response import Response
from rest_framework.decorators import action
from rest_framework.viewsets import GenericViewSet
from rest_framework.mixins import (
ListModelMixin,
CreateModelMixin,
RetrieveModelMixin,
UpdateModelMixin,
DestroyModelMixin,
)
from rest_framework.viewsets import ModelViewSet
from rest_framework import serializers
from rest_framework.authentication import (
BasicAuthentication,
SessionAuthentication,
)
from rest_framework.permissions import IsAuthenticated, AllowAny
from .models import *
from api.serializer import *
# 这种写法实现所有的增删改查,不能够单独进行操作
# class Linkapi(ModelViewSet):
# 不仅可以实现所有的增删改查,而且可以单独也可以全部包含增删改查
class Linkapi(
GenericViewSet,
ListModelMixin,
CreateModelMixin,
RetrieveModelMixin,
UpdateModelMixin,
DestroyModelMixin,
):
queryset = Link.objects.all()
serializer_class = LinkSerializer
authentication_classes = [SessionAuthentication]
permission_classes = [IsAuthenticated]
# 在原有的二级路由中自定义添加三级路由路径
# 访问路径/api/linkapi/{pk}/login/
@action(
methods=["get", "POST"],
detail=True,
url_path="login",
)
def login(self, request, pk):
queryset = self.get_queryset()
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
# detail为false表示路径名格式应该为/api/linkapi/get_new_5/
@action(
methods=[
"get",
],
detail=False,
)
def get_new_2(self, request):
obj = Link.objects.all().filter()[:2]
serializer = self.get_serializer(instance=obj, many=True)
return Response(serializer.data)
4、测试
5、仅允许查询,其他方式请求未授权不能访问
导入包
from rest_framework.permissions import (
IsAuthenticated,
AllowAny,
IsAuthenticatedOrReadOnly,
)
修改视图类内容
# IsAuthenticated 授权登录后可以访问
# IsAuthenticatedOrReadOnly 只允许查询
permission_classes = [IsAuthenticatedOrReadOnly]
6、