Шаблон проекту на Джанго з інструментами збирання та утилітами

Іноді доводиться створювати з нуля сайт Джанге. Це і випробування концепцій, і простенькі сторінки (адже якщо ми в проекті використовуємо різні сильні інструменти, чому б сайт-візитку не зробити теж з їх допомогою, позбавивши себе від ручної роботи?).

Отже, представляю публіці проект під девізом «Менше писанини! Швидше, дебаг! Набір для швидкої розробки на Джанго.

Це 2 шаблони:

  • шаблон конфігу buildout, який підтягує та збирає всі необхідні проекту пакети
  • шаблон проекту, а саме налаштування, що включають усі необхідні інструменти, та набір статики (готові файли на Haml та Sass)

Щоб завантажити проект та створити проект на Джанго, просто виконайте команди:

З чого складається проект:

Замість набору скриптів командного рядка ми в проекті з моєї роботи зробили Makefile і склали залежності команд, наприклад, що run можна виконати тільки після buildout та bootstrap. Я додав у make такі рутинні процедури:

  • run - запускає сервер на 0.0.0.0: 8000
  • shell_plus - запускає розширений командний рядок Джанго
  • make_messages - складає файл locale з html і haml
  • compile - компілює переклад

/.buildout, ізолює оточення проекту від додаткових пакетів (site packages) і виконує деякірецепти (наприклад, встановити скрипт і поставити на нього лінк з іншого).

У buildout є гнучка система налаштувань і готова колекція різних скриптів, загалом розвинена інфраструктура, якою можна користуватися, щоб зібрати працюючий проект.

Ось приклад найпростішої конфігурації, де ми встановлюємо Джангу з додатковими пакетами та статичний аналізатор кодуpyflakes :

Buildout скачає зі спеціального сайту рецептdjangorecipe та zc.recipe.egg і виконає їх.

Найцікавіший для нас -djangorecipe. Цей рецепт робить обгортку навколо скрипта manage.py, яка ізолює його від додаткових пакетів, встановлених у системі та підключає до нього лише яйця, вказані у конфігурації buildout.

Така конфігурація позбавляє нас від кількох головних болів:

  • ми десь можемо вказати, які яйця потрібні, і вони на будь-якій новій системі, наприклад, хостингу, встановляться автоматично та однією (!) командою
  • можемо бути впевненими, що на всіх системах будуть відкладені яйця однакової версії (можливо навіть старішої, але гарантовано працюючої)

Установка проекту проводиться в 2 команди:

Проект готовий і сервер Джанго для розробника вже можна запускати. Замість manage.py [команда] робимо

Але зручна система складання проекту далеко не все, що потрібно для прискореної розробки. Не поспішайте запускати новий написаний код. Перевірте статичним аналізатором. Дуже багато помилок їм відловлюються одразу.

(Звернення до 2 змінних, які не були оголошені. Без аналізатора ми двічі запускали б сайт і бачили баги.)

Після аналізаторів програмістам потрібні дебаггери. Їх у Пітоні є маса, але з тих, що ми перевірили в команді, найзручніший -PuDB, це інтерактивне середовище, яке працює як Midnight Commander у текстовому режимі і нагадує старі добрі QBasic або борландські середовища з 80- х років.

джанго

Щоб його запустити, потрібно вставити команду там, де потрібно налагодження:

всередині дебаггер дуже добре налаштовується (Ctrl+P), і з нього можна також зайти в консоль налагодження на IPython. Це потужна консоль Пітона з автозавершенням всього, що можна, та макросами, щоб записати таповторювати якісь дії, наприклад, налагоджуючи модулі.

Ще один дуже корисний інструмент – панель налагодження, або Django Debug Toolbar. За посиланням прямо на виданій сторінці є панель з усіма параметрами побудови сторінки, списком шаблонів і змінними всіх контекстів. Якщо сторінка не «впала», але виводить щось не те, не потрібно редагувати код, можна просто переглянути контексти.

Що ж, якщо сторінка падає? Зазвичай, якщо там відбувається якась неясна помилка, потрібно зробити таке:

Якщо ж у проекті встановлено Werkzeug, замість 5 дій потрібно зробити одну, тому що ця програма видає консоль посмертного налагодження прямо у вікні броузера. Причому у будь-якому рівні стеку виклику! Для багатьох проблем цього цілком достатньо.

Якщо код працює як слід, його потрібно зачесати для читання.

HAML, Sass, OOCSS

HAML - це, по суті, мова XML, очищена від сміттєвих символів, і в ньому є значуща табуляція. Якщо ви програмуєте на Джанго, то ви знаєте Пітон і його табуляцію. Атрибути тегів пишуться як JSON, теги Джанго підтримуються, деякі навіть автоматично закриваються:

Він перетворюється на такий документ:

У цьому проекті використовується HamlPy, який, як видно з лістингу, підтримує теги Джанго та звичайний HTML, якщо мови Haml вам буде недостатньо, наприклад:

Аналог Haml для CSS - мова Sass. У проекті Sass підтримуються 2 види розмітки: SCSS (аналог CSS з фігурними дужками) та SASS (аналог Haml та Пітона, з табуляцією). Я віддаю перевагу останній як лаконічніший. Найбільший виграш від Sass - стиснення всіх пропрієтарних правил, як *-linear-gradient, в один виклик:

Розгорнеться до великого списку з усіма реалізаціями градієнта (-moz-. -o-. -webkit-… і т.д.). Тут приклад не наводжу, алескажу тільки, що мова Sass підтримує цикли та умовні блоки @if… else. Існує аналогічний проект Less-CSS, і його за бажання також можна підключити до django-compressor, але він не дозволить робити такі маніпуляції, як цикли та перегрупування аргументів.

Стилі можна вкладати один в інший:

Object Oriented CSS — чудовий проект Ніколь Салліван, в якому вона зуміла приборкати правила, що розростаються, як цвіль, об'єднала і узагальнила деякі базові прийоми і отримала дуже компактну розмітку. Якщо ви не знайомі з OOCSS, перегляньте її виступи (англійською) та приклади коду з сайту проекту.

Ось ходові заготовки. Таблиці (у розмітці HAML):

«Медіа-блок», тобто картинка зліва і текст, що не обтікає картинку, праворуч:

Є також заготівля шаблону сторінки, блок контенту (прямокутник із шапкою, тілом та основою). У моєму проекті OOCSS вбудований як субрепозиторій, і його можна періодично оновлювати з ГітХаба.

Що добавити

Поки що проект є репозиторієм Mercurial, і ваш новий проект буде прив'язаний до мого репозиторію. Я раджу видаляти hgrc. Можливо, слід зробити зручніший інсталятор. Щоб виправити цей недолік, клонуйте проект та надсилайте ваші запити на злиття.

У найближчих планах:

Радий відгукам, форкайте проект, надсилайте запити на злиття.

Додавання:на ВедреБітов попросили додати інструкції щодо встановлення сторонніх компонентів. Відповідаю: сторонні компоненти вручну не треба встановлювати. SASS, Pyflakes та інші програми встановлять buildout.

Хардкорна конфа за С++. Ми запрошуємо лише профі.