drf_day04

路由

	1	在urls.py中配置  (当视图类继承了  ViewSetMixin, 路由的写法)
		    path('books/', views.BookViewSet.as_view({'get':'list', 'post':'create'})),
    		re_path('books/(?P<pk>\d+)', views.BookViewSet.as_view({'get':'retrieve', 'put':'update', 'delete':'destroy'})),


自动生成路由

urls.py
	# 第一步: 导入router模块
	from rest_framework import routers
	# 第二部:  有两个类    实例化得到对象
	# routers.DefaultRouter     生成的路由更多
	# routers.SimpleRouter
	router = routers.SimpleRouter()
	# 第三步:  注册
	# router.register('前缀', '继承自ModelViewSet视图类')
	router.register('books', views.BookViewSet)   # 不要加斜杠
	# 第四步
	# router.urls     # 自动生成的路由
	# print(router.urls)
	# urlpatterns+=router.urls
	urlpatterns = [
	    path('admin/', admin.site.urls),
	    # path('books/', views.BookViewSet.as_view({'get':'list', 'post':'create'})),
	    # re_path('books/(?P<pk>\d+)', views.BookViewSet.as_view({'get':'retrieve', 'put':'update', 'delete':'destroy'})),
	]
	
	urlpatterns+=router.urls

viwes.py
	from rest_framework.viewsets import ModelViewSet
	from app01.models import Book
	from app01.ser import BookSerializer
	
	class BookViewSet(ModelViewSet):
	    queryset = Book.objects
	    serializer_class = BookSerializer

action的使用

action干什么用的?  为了给继承自ModelViewSet的视图类中定义的函数也添加路由

怎么用?

	class BookViewSet(ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    # methods第一个参数, 传一个列表, 列表中放请求方式
    # ^books/get_1/$ [name='book-get-1'] 当向这个地址发送get请求 ,会执行下面的函数
    # detail: 布尔类型  如果是True
    # ^books/(?P<pk>[^/.]+)/get_1/$ [name='book-get-1']  就需要写完books/再写pk值/get_1/这样才行
    @action(methods=['GET'], detail=True)
    def get_1(self, request, pk):
        print(pk)
        book = self.get_queryset()[:2]      # 从0开始截取两条
        ser = self.get_serializer(book, many=True)
        return Response(ser.data)


# 首先是一个装饰器, 放在被装饰的函数上方, method:请求方式,  detail: 是否带pk

认证

# 认证的实现
	1	写一个类, 继承BaseAuthentication, 重写authenticate, 认证逻辑都写在这里面
	2	全局使用, 局部使用

认证组件的使用


from rest_framework.authentication import BaseAuthentication        # BaseAuthentication里面有两个方法 其中authenticate里面会直接抛出异常  就是告诉你 你必须重写它 否则就报错
from rest_framework.exceptions import AuthenticationFailed
from app01.models import UserToken


class 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, token

            # 认证失败
            else:
                raise AuthenticationFailed('认证失败')
        else:
            raise AuthenticationFailed('请求地中需要携带token')


全局使用  在 settings.py 中配置	可以有多个认证, 从左到右依次执行

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

局部使用, 在视图类上写

authentication_classes = [MyAuthentication]

局部禁用

authentication_classes = []

权限的使用

写一个类, 继承BasePermission, 重写has_permission,如果权限通过就返回True, 不通过就返回False

from rest_framework.permissions import BasePermission


class UserPermission(BasePermission):
    def has_permission(self, request, view):
        # 不是超级用户,不能访问
        # 由于已经认证过了, request内就有user对象
        user = request.user # 当前用户
        # get_字段名_display()可以获取choice 对应的中文名字
        print(user.get_user_type_display())
        if user.user_type == 1:
            return True
        else:
            return False

局部使用
class TestView(APIView):
    authentication_classes = [MyAuthentication]
    permission_classes = [UserPermission]
全局使用
REST_FRAMEWORK={
    "DEFAULT_AUTHENTICATION_CLASSES":["app01.app_auth.MyAuthentication",],
    'DEFAULT_PERMISSION_CLASSES': [
            'app01.app_auth.UserPermission',
        ],
}

局部禁用
class Test2View(APIView):
    permission_classes = []
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值