Публикации

Materialized Path в PostgreSQL

В реляционных базах данных хранение информации в виде древовидных структур является задачей с дополнительными накладными расходами. Такими дополнительными расходами могут быть как, увеличение количества запросов, так и увеличение количества информации, которая служит для организации структуры данных.

Распространнёными подходами для организации древовидных структур являются:

Adjacency List
Список смежных вершин

Организация структуры данных заключается в том, что каждый объект хранит информацию о родительском объекте, то есть в строке таблицы имеется дополнительное поле, в котором указывается ID объекта, в который вложен данный объект.
Nested Set
Вложенное множество
Вложенные множества хранят информацию не о так называемых левом и правом ключе, а также уровне вложенности. Данный вариант орагнизации структуры данных удобен для чтения, но более тяжело поддаётся модификации.
Materialized Path
Материализованный путь
Идея этой структуры данных заключается в том, что каждая запись хранит полный путь к корневому элементу дерева. 

Рассмотрение этих структур данных было вызвано необходимостью внедрения на сайт поддержки комментариев для статей.

Читать далее

  • Евгений Легоцкой
  • Евгений Легоцкой
  • 25 сентября 2016 г. 23:37

Иконки социальных сетей "Поделиться" без JavaScript

Иконки социальных сетей, с помощью которых можно поделиться статьей с сайта, уже прочно вошли в обиход большинства сайтов. Раскрутка сайта за счёт сарафанного радио вообще довольно эффективный вариант роста многих ресурсов, особенно, если тематика может затрагивать очень крупные социальные группы. Но сейчас в общем-то вопрос не об этом. А о том, как прикрутить подобные кнопки без использования сторонних сервисов, наподобие кнопок от Яндекса или довольно известного сервиса UpToLike, который также позволяет отслеживать статистику.

Но главный минус всех этих сервисов в том, что они подтормаживают работу страниц у пользователя. Особенно в последнее время меня огорчает UpToLike. Поэтому вполне логичным шагом является внедрение подобных кнопок без всякого JavaScript.

Читать далее

  • Евгений Легоцкой
  • Евгений Легоцкой
  • 24 сентября 2016 г. 19:59

Добавление файлов Sitemap на сайт с Django

RSS добавлена, но нужно помочь поисковым системам индексировать сайт. А делается это с помощью файлов Sitemap, которые описывают структуру сайта. Django предоставляет готовые классы и механизмы для формирования файлов Sitemap, причём имеется возможность для формирования вложенных в основной Sitemap, то есть дочерних файлов Sitemap, которые будут отвечать за определённые разделы. Также Django имеет возможность кеширования файлов Sitemap, что полезно в том случае, если на сайте присутствуют десятки тысяч ссылок.

С точки зрения текущего состояния сайта EVILEG COM будет сформировано три файла Sitemap, которые будут вложены в один главный:

  • Основной Sitemap с постоянными страницами и главной страницей сайта;
  • Sitemap разделов;
  • Sitemap статей.

Читать далее

  • Евгений Легоцкой
  • Евгений Легоцкой
  • 24 сентября 2016 г. 17:55

Добавление Pagination на основе django-bootstrap3

Количество статей на новом сайте начало приближаться к 10 штукам, поэтому в срочном порядке добавляю Pagination, чтобы была возможность пролистывать страницы на сайте. Но поскольку уже используется модуль django-bootstrap3, то и Pagination будет использоваться из этого модуля. Зачем же делать лишнюю работу, когда уже всё сделано? Не так ли.

Для добавления Pagination необходимо:

  1. Использовать класс Paginator из django.core.pagination;
  2. Добавить в шаблон главной страницы bootstrap_pagination с привязкой ;
  3. Добавить проверку текущего номера страницы;
  4. И ... не добавлять ничего нового в шаблоны url.  

Читать далее

  • Евгений Легоцкой
  • Евгений Легоцкой
  • 21 сентября 2016 г. 22:12

Кастомизация страниц ошибок 403, 404, 500

Многие ресурсы имеют оформленные страницы ошибок, если происходит сбой в обработке запроса от клиента. 
Для начала на сайте была сделана кастомизация наиболее часто возникающих ошибок, другие при отладке пока не попадались, но всё впереди.

Как объявлено в заголовке статьи, кастомизированы был следующие ошибки:

  1. 403 - Ошибка авторизации, доступ запрещён.
  2. 404 - Страница не найдена;
  3. 500 - Внутренняя ошибка сервера;

Читать далее

  • Евгений Легоцкой
  • Евгений Легоцкой
  • 21 сентября 2016 г. 10:13

Добавление RSS ленты на сайт с Django

Пока статей ещё не много на новом сайте, добавлю-ка я RSS-ленту, благо, что Django имеет встроенный функционал для организации RSS-лент, как в обычном фомате, так и в формате Atom. Но для начала ограничусь добавлением обычно ленты новостей, которая может быть подключена к сервису FeedBurner, а также найдена на сайте каким-нибудь RSS-Ридером. Я, например, использую QuiteRSS, который, к слову говоря, написан на Qt5.

Что требуется для организации RSS-ленты в минимальном варианте:

  1. Добавить ссылку на ленту в тело head-тега страницы;
  2. Написать представление, которое будет отвечать за подготовку ленты;
  3. Модифицировать модель, по объектам которой будет строиться лента новостей.

Читать далее

  • Евгений Легоцкой
  • Евгений Легоцкой
  • 20 сентября 2016 г. 23:20

Подключение Bootstrap 3 к сайту на Django

Дизайн сайта и его вёрстка являются довольно важными вопросами, и порой хочется разработать сайт с хорошим и интересным дизайном... но... Не все из нас дизайнеры, и ещё меньше хороших дизайнеров. Поэтому мне проще было взять Bootstrap 3, найти хорошую тему оформления для него, а точнее кастомизированный в едином стиле CSS, и не заморачиваясь начать разработку сайта с уже проверенным многими web-мастерами инструментом.

Давайте посмотрим, как обстоит дело с Bootstrap 3 в Django.

Читать далее

  • Евгений Легоцкой
  • Евгений Легоцкой
  • 18 сентября 2016 г. 18:48

Модель, шаблон и представление в Django

В Django используется модульная система приложения, когда одно приложение состоит из нескольких приложений, отвечающих каждое за свой функционал. Как Вы успели заметить, на момент написания статьи, на сайте присутствует раздел "База Знаний", в котором присутствует несколько разделов, по которым уже разделены статьи.

При работе с предыдущим сайтом на Wordpress, бестолково тратилось время на добавление новых статей в список уроков по Qt. На данном же сайте страница является автоматически генерируемой и при сохранении новой статьи со статусом опубликовано, данная статья автоматически попадает в список соответствующего раздела.

Предлагаю разобраться, как это реализуется в минимальном варианте на примере EVILEG COM.

Читать далее

  • Евгений Легоцкой
  • Евгений Легоцкой
  • 18 сентября 2016 г. 13:41

Подсветка синтаксиса кода на сайте

Самым большим головняком при начале написания сайта с нуля на Django была подсветка синтаксиса кода. Ладно, на Wordpress был плагин, который справлялся со своёй задачей, хоть и подгружал немного сайт, поскольку подсветка организовывалась на стороне сервера. Но в случае с новым сайтом пришлось уже задуматься на эту тему. 

Сначала выбор стоял на тему того, где именно будет огранизовываться подсветка синтаксиса:

  • На стороне сервера
  • Или на стороне клиента

Поискав информацию, выяснил, что для организации синтаксиса на стороне сервера готовых решений не так уж и много, например Geshi, да и всё пожалуй, что работает на Python. Да и тот может нагружать сервер, если есть косяки в кешировании.

А вот с подсветкой синтаксиса на стороне клиента стало уже поинтереснее. Тут например и Hightlight.js и SyntaxHighlighter, и легковесный скрипт от корпорации добра Google, Javascript Code Prettifier, на него выбор и пал. Тем более, что он используется на таком известном ресурсе, как Stack Overflow.

Читать далее

  • Евгений Легоцкой
  • Евгений Легоцкой
  • 17 сентября 2016 г. 1:25

Развёртывание сайта на Django + PostgreSQL + Gunicorn + Nginx

После того, как доступ к серверу с Ubuntu 16.04 был настроен в одной из предыдущих статей, настало время развернуть на нём всё необходимое для работы сайта, а именно:

  • Django - фреймворк для разработки web-приложений на языке Python;
  • PostgreSQL - базу данных SQL ;
  • Gunicorn - WSGI HTTP сервер на Python для UNIX систем;
  • Ngnix - HTTP-сервер и обратный прокси-сервер, почтовый прокси-сервер, а также TCP/UDP прокси-сервер общего назначения;
  • Supervisor - это менеджер процессов, который существенно упрощает управление долго работающими программами, в частности сайтами, которые необходимо автоматически перезапускать после падений.

Читать далее

  • Евгений Легоцкой
  • Евгений Легоцкой
  • 16 сентября 2016 г. 23:56