ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

djangochannelsrestframework 分页实战:WebSocket 海量数据列表的 2 种优雅方案

djangochannelsrestframework 分页实战:WebSocket 海量数据列表的 2 种优雅方案 djangochannelsrestframework 分页实战WebSocket 海量数据列表的 2 种优雅方案【免费下载链接】djangochannelsrestframeworkA Rest-framework for websockets using Django channels-v4项目地址: https://gitcode.com/gh_mirrors/dj/djangochannelsrestframework当你的 Django Channels 项目开始实时推送上千条记录时一次性把全部数据塞进 WebSocket 消息里不仅会让浏览器卡顿、内存暴涨还会拖垮服务器带宽。djangochannelsrestframework基于 Django channels-v4 的 WebSocket REST 框架内置了一套与 DRF 风格一致的分页体系让我们能用熟悉的limit / offset思路优雅地搞定海量数据列表。本文用最通俗的方式带你掌握它的 2 种分页方案单页返回的PaginatedModelListMixin和自动流式推送的StreamedPaginatedListMixin。为什么 WebSocket 列表也需要分页很多人以为 WebSocket 是长连接数据想发多少发多少。但实际上客户端渲染压力大上万条 DOM 节点直接拖垮前端单条消息体积失控JSON 序列化、传输、反序列化都是开销用户体验差首屏加载慢翻页逻辑混乱所以WebSocket 分页的核心思路和 REST API 完全一致——每次只返回一小页由客户端按需索取或服务端自动续传。方案一PaginatedModelListMixin 手动翻页 这是最直观的方案客户端发一条list消息服务端返回一页数据含总数count和limit/offset客户端再根据偏移量发送下一条消息取下一页。第一步配置分页类djangochannelsrestframework 默认提供了 WebsocketLimitOffsetPagination它继承自 DRF 的LimitOffsetPagination默认每页大小取配置项DEFAULT_PAGE_SIZE默认 25响应格式固定为{ count: 100, results: [...], limit: 25, offset: 0 }第二步写一个带分页的 Consumer只需在 mixin 列表里加上PaginatedModelListMixin并指定pagination_class# consumers.py from djangochannelsrestframework.generics import GenericAsyncAPIConsumer from djangochannelsrestframework.mixins import PaginatedModelListMixin from djangochannelsrestframework.pagination import WebsocketLimitOffsetPagination from .serializers import ArticleSerializer from .models import Article class ArticleConsumer(PaginatedModelListMixin, GenericAsyncAPIConsumer): queryset Article.objects.all() serializer_class ArticleSerializer pagination_class WebsocketLimitOffsetPagination第三步客户端按页索取// 第 1 页 ws.send(JSON.stringify({ action: list, request_id: 1, limit: 20, offset: 0 })); // 第 2 页 ws.send(JSON.stringify({ action: list, request_id: 2, limit: 20, offset: 20 }));服务端内部通过paginate_queryset对 queryset 做切片见 mixins.py 中的PaginatedModelListMixin并自动处理offset超出总数时返回空列表的边界情况。翻页完全由前端掌控适合分页按钮、滚动加载等场景。方案二StreamedPaginatedListMixin 一键流式拉取 ⚡如果你希望一次请求自动收完所有页比如初始化聊天记录、导出全量数据手动逐页请求太啰嗦了。这时用StreamedPaginatedListMixin——它继承自方案一但list动作是异步递归的每发完一页只要还有剩余数据offset count - limit就自动更新 offset 继续发送直到全部推完。# consumers.py from djangochannelsrestframework.mixins import StreamedPaginatedListMixin class ArticleStreamConsumer(StreamedPaginatedListMixin, GenericAsyncAPIConsumer): queryset Article.objects.all() serializer_class ArticleSerializer pagination_class WebsocketLimitOffsetPagination客户端只发一条消息就能连续收到多条分页响应ws.send(JSON.stringify({ action: list, request_id: 1, limit: 50, offset: 0 })); // 收到第 1 页offset0 // 收到第 2 页offset50 // 收到第 3 页offset100...直到最后一页核心逻辑在 mixins.py 的StreamedPaginatedListMixin中每页发送后判断offset (count - limit)是则递归调用自身。前端只需监听消息并逐页追加渲染即可非常适合大列表一次拉全、边收边渲染的实时场景。两种方案怎么选一张表看懂 对比维度PaginatedModelListMixinStreamedPaginatedListMixin控制权前端手动翻页服务端自动续传请求次数每页一条消息一次请求N 条响应适合场景分页器、下拉加载历史记录初始化、全量同步实时性按需获取一次性拉完进阶技巧全局默认分页与自定义每页大小 不想在每个 Consumer 里重复配置可以在 Django 的settings.py中设置全局默认DJANGO_CHANNELS_REST_API { DEFAULT_PAGE_SIZE: 50, DEFAULT_PAGINATION_CLASS: djangochannelsrestframework.pagination.WebsocketLimitOffsetPagination, }配置读取逻辑见 settings.py默认值为 25。你也可以像官方测试 test_generic_consumer.py 那样继承WebsocketLimitOffsetPagination并重写default_limit实现每页条数的灵活控制。写在最后 djangochannelsrestframework 的分页设计几乎零学习成本——如果你用过 DRF这套count / results / limit / offset的响应结构完全无缝衔接。手动翻页 流式拉取两种方案覆盖了绝大多数 WebSocket 海量数据列表场景。从 25 条默认分页开始先让列表不再卡顿再逐步优化成流式体验。动手试试你的实时应用会立刻轻下来【免费下载链接】djangochannelsrestframeworkA Rest-framework for websockets using Django channels-v4项目地址: https://gitcode.com/gh_mirrors/dj/djangochannelsrestframework创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表