上节课回顾
APIView
GenericAPIView:跟数据库打交道,而且需要序列化反序列化,可以使用它
-list
-retrieve
-destroy
-create
-update
-正常需要写两个视图类,实现5个接口
-BookView:list,create
-BookDetailView:retrieve,destroy,update
-5个接口只想写新增和更新----》两个视图类
-如果配合自动生成路由:ViewSetMixin+list+update+GenericAPIView 可以写到一个视图类中
-5个接口:自动生成路由+5个视图扩展类+GenericAPIView---》一个视图类即可
-5个,两两组合,三个组合
-ModelViewSet
-ReadOnlyModelViewSet
-ViewSetMixin:不是视图类,配合视图类一起用,重写了as_view---》路由写法变了--》本质就是通过传的actions做映射{'get':"xxx"}
-传actions方式
-自动生成方法
-继承APIView+自动生成路由----》ViewSet
-继承GenericAPIView+自动生成路由----》GenericViewSet
-引申出来:后期在视图类中的方法,可以任意命名,只要做好映射,或自动生成即可
-三种写法
-传统写法:不继承ViewSetMixin及其子类的
-映射写法:传actions
-自动生成写法:两个类,加入到路由中:两种(include,列表直接加)
-action装饰器
-自动生成路由时,做自动生成,装饰在视图类的方法上
@action(methods=['POST','GET'],detail=False)
-ViewSetMixin+APIView login ---》使用action装饰器装饰---》post请求
-取出前端传入的数据(三种格式都可以)---》request.data
-写逻辑判断是否登录成功----》UserToken存储登录状态
-如果存在修改,不存在就更新
-返回给前端
今日内容
1 认证组件
-登录认证的限制
1.1 认证组件使用步骤
-局部:只在某个视图类中使用【当前视图类管理的所有接口】
class BookDetailView(ViewSetMixin, RetrieveAPIView):
authentication_classes = [LoginAuth]
-全局:全局所有接口都生效(登录接口不要)
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES':['app01.authenticate.LoginAuth']
}
-局部禁用:
class BookDetailView(ViewSetMixin, RetrieveAPIView):
authentication_classes = []
1.1 代码
class BookView(ViewSetMixin, ListAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
class BookDetailView(ViewSetMixin, RetrieveAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
class LoginAuth(BaseAuthentication):
def authenticate(self, request):
token = request.query_params.get('token', None)
if token:
user_token = UserToken.objects.filter(token=token).first()
if user_token:
return user_token.user, token
else:
raise AuthenticationFailed('token认证失败')
else:
raise AuthenticationFailed('token没传')
router.register('books', views.BookView, 'books')
router.register('books', views.BookDetailView, 'books')
-不要在配置文件中乱导入不使用的东西,否则会报错
2 权限组件
-查询单个需要超级管理员才能访问
-查询所有,所有登录用户都能访问
2.1 权限的使用
-局部:只在某个视图类中使用【当前视图类管理的所有接口】
class BookDetailView(ViewSetMixin, RetrieveAPIView):
permission_classes = [CommonPermission]
-全局:全局所有接口都生效
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'app01.permissions.CommonPermission',
],
}
-局部禁用:
class BookDetailView(ViewSetMixin, RetrieveAPIView):
permission_classes = []
3 频率组件
3.1 使用步骤
'DEFAULT_THROTTLE_RATES': {
'book_5_m': '5/m',
},
-局部:只在某个视图类中使用【当前视图类管理的所有接口】
class BookDetailView(ViewSetMixin, RetrieveAPIView):
throttle_classes = [CommonThrottle]
-全局:全局所有接口都生效
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': ['app01.throttling.CommonThrottle'],
}
-局部禁用:
class BookDetailView(ViewSetMixin, RetrieveAPIView):
throttle_classes = []
4 过滤排序
-5个接口中,只有一个接口需要有过滤和排序,查询所有接口
4.0 继承APIView 自己写(伪代码,自己补齐)
class BookView(APIView):
def get(self,request):
search=request.query_params.get('search')
books=Book.objects.filter()
4.1 内置过滤类的使用【继承GenericAPIView】
class BookView(ViewSetMixin, ListAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
filter_backends = [SearchFilter]
search_fields = ['name','price']
http://127.0.0.1:8000/api/v1/books/?search=红
4.2 使用第三方djagno-filter实现过滤
class BookView(ViewSetMixin, ListAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
permission_classes = []
authentication_classes = []
throttle_classes = []
filter_backends = [DjangoFilterBackend]
filterset_fields = ['name','price']
http://127.0.0.1:8000/api/v1/books/?price=939
http://127.0.0.1:8000/api/v1/books/?price=939&name=红楼猛
4.3 自己定制过滤类实现过滤
http://127.0.0.1:8000/api/v1/books/?price_gt=100
class CommonFilter(BaseFilterBackend):
def filter_queryset(self, request, queryset, view):
price_gt = request.query_params.get('price_gt', None)
if price_gt:
qs = queryset.filter(price__gt=int(price_gt))
return qs
else:
return queryset
class BookView(ViewSetMixin, ListAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
filter_backends = [CommonFilter]
4.4 排序的使用
class BookView(ViewSetMixin, ListAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
filter_backends = [OrderingFilter]
ordering_fields = ['price']
http://127.0.0.1:8000/api/v1/books/?ordering=price
http://127.0.0.1:8000/api/v1/books/?ordering=-price
http://127.0.0.1:8000/api/v1/books/?ordering=-id,price
5 分页
class CommonPageNumberPagination(PageNumberPagination):
page_size = 2
page_query_param = 'page'
page_size_query_param = 'size'
max_page_size = 5
class CommonLimitOffsetPagination(LimitOffsetPagination):
default_limit = 3
limit_query_param = 'limit'
offset_query_param = 'offset'
max_limit = 5
class CommonCursorPagination(CursorPagination):
cursor_query_param = 'cursor'
page_size = 2
ordering = 'id'
class BookView(ViewSetMixin, ListAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
permission_classes = []
authentication_classes = []
throttle_classes = []
pagination_class = CommonCursorPagination
作业
-所有接口,一分钟访问10次
-查询所有图书和查询单条图书不登录可以访问
-新增,删除,修改必须登录后才能访问
-删除功能只有超级管理员能删除
-------------------------------------------
-继承BaseThrottle,重写allow_request,实现按ip,一分钟只能访问3次
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现