Войти Регистрация
Код-ревью

37. Этикетка для отправки с Авито Доставкой

Лёгкая

Python · 26 строк

Продавец печатает этикетку и клеит на коробку перед сдачей в пункт приёма. На этикетке — ФИО и телефон покупателя, пункт выдачи и штрихкод. PDF рисуется 1–2 секунды, поэтому готовые файлы кэшируются на диске.

Форматы: a6, a4 и thermal58 для термопринтера. Покупатель может сменить пункт выдачи, пока посылку не сдали. Отметьте строки с ошибками.

В работе: Кнопка «Распечатать этикетку» в карточке заказа у продавца.

Как проверяем Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Ответ один на подход: после него показываем разбор.
Flaskдоступ к даннымфайлыpath traversalкэш

Источник: наша задача на данных Авито: отправления Авито Доставки. Условие пересказано своими словами.

  1. import os
  2. from flask import Flask, abort, request, send_file
  3. from flask_login import login_required
  4. from .labels import render_label_pdf
  5. from .models import Shipment
  6. app = Flask(__name__)
  7. LABELS_DIR = "/var/avito/labels"
  8. @app.get("/delivery/label")
  9. @login_required
  10. def download_label():
  11. shipment_id = request.args.get("shipment_id")
  12. fmt = request.args.get("format", "a6")
  13. shipment = Shipment.query.get(shipment_id)
  14. if shipment.status == "cancelled":
  15. abort(410)
  16. path = os.path.join(LABELS_DIR, f"{shipment_id}_{fmt}.pdf")
  17. if not os.path.exists(path):
  18. pdf = render_label_pdf(shipment, size=fmt)
  19. f = open(path, "wb")
  20. f.write(pdf)
  21. return send_file(path, mimetype="application/pdf")