资讯动态

基于 Django + django_rq + wkhtmltopdf 的收据打印服务:ФорФар 餐饮配送后端实战任务全解

发布时间:2026/10/9 1:22:15 来源:尧图企业网站定制
教程【免费下载链接】ru-test-assignmentsТестовые задания для самостоятельного выполнения от разных it компаний项目地址https://gitcode.com/gh_mirrors/ru/ru-test-assignments点击查看免费下载导读本文以ru-test-assignments仓库中 pyshop 测试任务 为骨架完整还原一家餐饮配送网络ФорФар的收据生成与打印后端服务的设计与实现要求Django 提供 API 与后台管理、PostgreSQL 存储数据、django_rq Redis 驱动异步 PDF 生成、wkhtmltopdf 完成 HTML→PDF 渲染、桌面端应用通过 API 轮询并打印。读完本文你将掌握一个订单 → 分店打印机 → 异步 PDF → 轮询下载打印全链路收据服务的建模、接口约定与基础设施编排方案可直接据此复刻实现或用于面试准备。业务背景与服务目标连锁餐饮配送网络 ФорФар 拥有多个生产点point每个点现场制作客户订单。两类人群都需要收据чек / check客户随订单拿到包含明细信息的消费凭证厨房员工在制作与打包过程中核对订单内容避免遗漏。因此系统核心目标是为每个订单按生产点生成两类收据kitchen厨房与client客户并通过绑定在各生产点的打印机输出纸质版。整个服务围绕接收订单 → 生成收据记录 → 异步渲染 PDF → 打印机轮询取件打印这条链路展开。服务工作流三步链路任务文档给出清晰的架构流程图原图见 images/arch.png当前仓库未携带该图片文件其核心步骤可归纳为创建收据ERP 端把新订单信息 POST 给服务服务在数据库中为订单所属生产点point_id下的所有打印机各创建一条收据记录并为每条记录投递一个异步 PDF 生成任务。若该生产点没有任何打印机 → 返回错误若该订单的收据已存在重复提交→ 返回错误。异步渲染 PDF后台 worker 使用 wkhtmltopdf 把 HTML 模板渲染成 PDF。文件命名规则为订单ID_收据类型.pdf例如123456_client.pdf文件统一存放于项目根目录media/pdf目录。打印机轮询打印桌面打印端周期性调用 API——先查询当前打印机可打印的收据列表再逐个下载对应 PDF 文件并送入打印机输出。技术栈与硬性约束组件要求说明语言/框架Python Django服务端主体数据库PostgreSQL v9.6收据与打印机数据持久化异步任务django_rq基于 Redis 的任务队列基础设施docker-compose 启动 PostgreSQL / Redis / wkhtmltopdf仅基础设施容器化项目本身不打包进 Docker管理后台Django Admin两个模型均可管理收据支持按打印机、类型、状态过滤HTML 模板仓库templates目录收据版式模板预置在任务仓库中几点工程提示原文档Примечания不要重复造轮子优先复用成熟组件wkhtmltopdf 官方 Docker 镜像等建议直接使用 wkhtmltopdf 容器镜像 简化 PDF 渲染环境的搭建任务中的 HTML 收据模板已随仓库提供位于templates目录。技术选型说明为什么用 django_rq 而不是 Celery任务明确指定 django_rq——它把 RQ 任务队列与 Django ORM、Admin 深度集成配置量小、适合中小规模异步任务此处仅为 PDF 渲染与不造轮子、用现成方案的要求一致。wkhtmltopdf 的角色把 Django 渲染好的 HTML 模板字符串转为 PDF 字节流由 worker 写入media/pdfdocker 化部署规避了 wkhtmltopdf 对系统库X 服务器、字体的依赖问题。数据模型设计Printer打印机每个打印机只打印一种类型的收据kitchen或client通过全局唯一的api_key在 API 层标识自身。任务要求提供 fixtures预置覆盖两类收据类型、多个生产点的打印机样例数据便于本地联调。字段类型可选值说明nameCharField—打印机名称api_keyCharField—API 访问密钥唯一用于身份识别check_typeCharFieldkitchen|client该打印机输出的收据类型point_idIntegerField—打印机所属生产点 IDCheck收据任务明确订单信息整体以 JSON 存储无需为订单细节拆分关联模型——order字段直接承载整个订单快照天然满足打印时不再查 ERP的需求。字段类型可选值说明printer_idForeignKey—关联打印机typeCharFieldkitchen|client收据类型orderJSONField—订单完整信息JSONstatusCharFieldnew|rendered|printed收据状态机pdf_fileFileField—生成的 PDF 文件引用状态机流转new已创建、待渲染→renderedPDF 已生成→printed已打印。这一字段同时支撑了管理后台的过滤与打印端的轮询逻辑只取rendered状态的收据下载 PDF。API 接口约定Swagger 2.0 / OpenAPI 3.0任务仓库随附完整接口规范 api.yml可在 Swagger Editor 或 PyCharm / VSCode 的 OpenAPI 插件中渲染查看。规范定义了两个服务方erp标签ERP 系统调用创建收据app标签打印端应用调用取件与下载。开发环境服务地址为http://localhost:8000/。POST /create_checks/ — 创建订单收据ERP → 服务请求体为订单 JSON见Orderschema关键字段示例取自 api.yml{ id: 123456, price: 780, items: [ { name: Вкусная пицца, quantity: 2, unit_price: 250 }, { name: Не менее вкусные роллы, quantity: 1, unit_price: 280 } ], address: г. Уфа, ул. Ленина, д. 42, client: { name: Иван, phone: 9173332222 }, point_id: 1 }其中items[].name / quantity / unit_price构成订单明细client.name / phone为客户信息point_id决定在哪些打印机上开单。响应约定200{ok: Чеки успешно созданы}收据创建成功400创建失败两种原因——该订单收据已存在或该生产点未配置任何打印机返回{error: ...}结构。GET /new_checks/?api_key... — 查询可打印收据打印端 → 服务查询参数api_key必填打印机身份凭证200返回{checks: [{id: ...}, ...]}收据列表仅该打印机对应类型、且 PDF 已就绪的收据401api_key对应的打印机不存在返回{error: Ошибка авторизации}。GET /check/?api_key...check_id... — 下载收据 PDF打印端 → 服务查询参数api_key必填check_id必填收据 ID200返回application/pdf二进制流即收据 PDF 文件401打印机身份无效400两种错误——收据不存在或该收据 PDF 尚未生成。注意 api.yml 中Checkschema 目前仅声明了id字段实际实现中建议按状态返回更多信息如status但必须与 Swagger 规范保持一致避免打印端解析失败。关键实现要点1. 创建收据的幂等与边界校验/create_checks/处理器应按以下顺序处理校验订单point_id下是否存在打印机若Printer.objects.filter(point_id...).count() 0直接返回 400未配置打印机校验该订单是否已开单可通过Check.objects.filter(order__id...)或为order.id建唯一约束判断已存在则返回 400重复创建为每个打印机Check.objects.create(...)并enqueue(render_pdf, check_id)投递异步渲染任务。2. 异步 PDF 渲染任务worker 端任务伪流程def render_pdf(check_id): check Check.objects.get(idcheck_id) html render_check_template(check) # Django template 渲染 pdf wkhtmltopdf.render(html) # 调用 wkhtmltopdf path save_to_media_pdf(check, pdf) # media/pdf/order_id_type.pdf check.pdf_file path check.status rendered # new - rendered check.save(update_fields[pdf_file, status])文件名严格遵循订单ID_收据类型.pdf规范目录固定为项目根media/pdf。3. 打印端轮询流程打印端桌面应用的循环逻辑GET /new_checks/?api_keyprinter_api_key取该打印机可打印收据列表逐条GET /check/?api_key...check_idid下载 PDF送入打印机输出后回写状态可由打印端另行调用或服务端按约定更新为printed避免重复打印。4. Django Admin 过滤为Printer、Check注册 admin并在CheckAdmin中配置list_filter (printer_id, type, status)实现按打印机、收据类型、状态三个维度的后台过滤满足任务第 5 条硬性要求。基础设施编排docker-compose任务要求基础设施容器化、项目本体不打包。典型编排如下services: db: image: postgres:9.6 environment: POSTGRES_DB: checks POSTGRES_USER: checks POSTGRES_PASSWORD: checks ports: [5432:5432] redis: image: redis:latest ports: [6379:6379] wkhtmltopdf: image: openlabs/docker-wkhtmltopdf-aas # 与任务推荐镜像一致 ports: [1100:1100]PostgreSQL 9.6django.db.backends.postgresql连接配置Redisdjango_rq的队列后端RQ_QUEUES指向redis://localhost:6379/0wkhtmltopdfworker 通过 HTTP 调用容器化渲染服务避免在宿主环境编译安装 wkhtmltopdf 的系统依赖。启动流程docker-compose up -d拉起三个基础设施 → 宿主机上python manage.py migrate、python manage.py loaddata fixtures→python manage.py runserverAPI/Admin→python manage.py rqworker异步任务。与其他任务的关联仓库视角ru-test-assignments仓库 backend/smena/backend.md 保存了该任务的同源本地副本可交叉对照仓库 backend/python/pyshop/api.yml 是本文 API 章节的直接依据。若需深入 Django 技术细节可参考仓库内其他后端任务如 avito-tech 后端任务作为风格参考。验收清单实现完成后建议自检以下要点订单创建后每个打印机各生成一条 Check且投递异步任务无打印机 / 重复订单两种场景均返回 400PDF 命名123456_client.pdf格式正确落盘于media/pdf打印端凭api_key可拉列表、下载 PDF非法密钥返回 401Admin 中 Check 可按打印机、类型、状态过滤PostgreSQL / Redis / wkhtmltopdf 均由 docker-compose 提供项目本身未容器化。结语该任务是一个典型的业务链路完整、边界清晰的中级 Django 后端实战既考 JSON 建模与状态机设计也考异步任务编排与外部进程wkhtmltopdf集成还覆盖了 OpenAPI 接口约定与 docker-compose 基础设施编排。对照 README 与 api.yml 逐条实现即可得到一套可运行、可演示的收据打印后端服务。赞分享教程【免费下载链接】ru-test-assignmentsТестовые задания для самостоятельного выполнения от разных it компаний项目地址https://gitcode.com/gh_mirrors/ru/ru-test-assignments点击查看免费下载相关推荐AgentForge记忆系统完全攻略让AI智能体拥有上下文感知能力AgentForge记忆系统完全攻略让AI智能体拥有上下文感知能力 在构建智能AI助手时 记忆系统 是实现 上下文感知 和 个性化交互 的关键技术。AgenAudioShare如何将Windows系统音频无线同步到安卓设备AudioShare如何将Windows系统音频无线同步到安卓设备 你是否曾想过在手机上播放电脑的游戏音效 或者将电脑的会议音频分享给多个同事的安卓设音视频音频处理Astro餐饮服务餐厅订餐系统开发Astro餐饮服务餐厅订餐系统开发 痛点传统订餐系统的性能瓶颈 你是否遇到过这样的场景餐厅网站加载缓慢顾客在高峰期无法顺利下单移动端体验差SEO效果前端Web框架SSR前端构建上一篇Stride 着色器 Mixin 编译流水线解析从 SDSL 到 SPIR-V 的合并与 ID 重映射下一篇ESP32 Arduino核心深度指南从硬件连接到物联网应用开发创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑