DRF(二):分页、权限、授权、过滤、跨域

分页

1. PageNumberPagination
  • 局部分页
# setting.py
# drf相关配置
REST_FRAMEWORK = {
    "PAGE_SIZE": 2,
}


# views.py

from rest_framework.pagination import PageNumberPagination

class UserView(ListCreateAPIView):
    # 分页
    pagination_class = PageNumberPagination
  • 全局分页
# drf相关配置
REST_FRAMEWORK = {
    "PAGE_SIZE": 2,
    'DEFAULT_PAGINATION_CLASS': "rest_framework.pagination.PageNumberPagination",
}
  • 效果
{
    "count": 6,
    "next": "http://127.0.0.1:8000/user/?page=3",
    "previous": "http://127.0.0.1:8000/user/",
    "results": [
        {
            "url": "http://127.0.0.1:8000/user/10",
            "username": "233214",
            "password": "666888",
            "gender": "1",
            "tel": "123456789"
        },
        {
            "url": "http://127.0.0.1:8000/user/12",
            "username": "233214古典风格",
            "password": "666888",
            "gender": "1",
            "tel": "123456789"
        }
    ]
}
2. LimitOffsetPagination
  • 设置
    from rest_framework.pagination import LimitOffsetPagination
    pagination_class = LimitOffsetPagination
  • 效果
{
    "count": 6,
    "next": "http://127.0.0.1:8000/user/?limit=2&offset=4",
    "previous": "http://127.0.0.1:8000/user/?limit=2",
    "results": [
        {
            "url": "http://127.0.0.1:8000/user/10",
            "username": "233214",
            "password": "666888",
            "gender": "1",
            "tel": "123456789"
        },
        {
            "url": "http://127.0.0.1:8000/user/12",
            "username": "233214古典风格",
            "password": "666888",
            "gender": "1",
            "tel": "123456789"
        }
    ]
}
3. CursorPagination

from rest_framework.pagination import CursorPagination
pagination_class = CursorPagination
此时报错:

Cannot resolve keyword 'created' into field. Choices are: address, gender, id, password, tel, username

原因是内置分页类中默认按照‘created’字段排序,但自己写的User类中没有该字段。
解决:编写新类继承原类,重写ordeing的值

# user\paginations.py

from rest_framework.pagination import CursorPagination

# 按照tel字段排序的分页器
class TelCuroserPagination(CursorPagination):
    ordering = '-tel'
# views.py

from user.paginations import *

class UserView(ListCreateAPIView):
	pagination_class = TelCursorPagination
  • 效果
    页面显示previous/next按钮
{
    "next": "http://127.0.0.1:8000/user/?cursor=cD02Nzg5",
    "previous": "http://127.0.0.1:8000/user/?cursor=bz0xJnI9MSZwPTY3ODk%3D",
    "results": [
        {
            "url": "http://127.0.0.1:8000/user/1",
            "username": "wsm",
            "password": "666888",
            "gender": "0",
            "tel": "123456789"
        },
        {
            "url": "http://127.0.0.1:8000/user/12",
            "username": "233214古典风格",
            "password": "666888",
            "gender": "1",
            "tel": "6789"
        }
    ]
}
4. 在自定义函数中用drf分页器实现分页
# user\paginations.py

from rest_framework.pagination import CursorPagination

# 按照tel字段排序的分页器
class TelCuroserPagination(CursorPagination):
    ordering = '-tel'
# views.py

class UserView(ListCreateAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

    # 分页
    pagination_class = TelCursorPagination
    
    def list(self, request, *args, **kwargs):
        paginator = self.pagination_class()

        page = paginator.paginate_queryset(self.queryset, request)

        serializer = self.serializer_class(page, many=True, context={
   "request": request})

        return paginator.get_paginated_response(serializer.data)

权限管理

  • AllowAny
  • IsAuthenticated
  • IsAdminUser
  • IsAuthenticatedOrReadOnly
from rest_framework.permissions import IsAuthenticated

class UserView(ListCreateAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

    # 分页
    pagination_class = TelCursorPagination

    # 权限
    permission_classes = [IsAuthenticated]

DRF授权管理

默认采用session登录授权。
创建超级用户python manage.py createsuperuser,登录
如果报错Table 'xxx.auth_user' doesn't exist,执行迁移的两个步骤。

JWT(JSON WEB Token)授权管理

  • 安装
    pip install djangorestframework_simplejwt
  • 配置
# drf相关配置
REST_FRAMEWORK = {
    # 分页
    "PAGE_SIZE": 5,
    'DEFAULT_PAGINATION_CLASS': "rest_framework.pagination.PageNumberPagination",

    # 权限
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ],
}
  • 设置路由
    添加api/token/</
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值