python django

Если бы меня спросили, 25 лет назад, на чём делать сайт - я бы не задумываясь ответил - HTML. 10 лет назад - php, 5 лет назад - joomla/wordpress. А сейчас я бы задумался и спросил с какой целью создаётся сайт.

Для сайта-блога, наверное и по сей день актуальны движки Joomla и WordPress, написанные на PHP. А вот для специфических задач всё чаще и чаще используется Python. Их много: Jango, Pyramid, TurboGears... боюсь, все не перечислить. Почему питон для web-разработки становится популярнее php однозначно сказать трудно. Мне кажется всё дело в модульности. Для php тоже есть модули, но они, во-первых устанавливаются только админом сервера, а во-вторых для их написания нужен достаточно высокий порог вхождения. В python же просто модули и писать и устанавливать - для своего пользователя, не имея при этом рутовых прав.

Итак, Django. Выбран он был только по причине популярности. И вполне возможно, что для какой-то конкретной задачи лучше подойдёт другой конкретный фреймворк.

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

Django

Джанго - веб-сервер на питоне. При создании проекта, там нет ничего, даже CMS. Есть только админская панель с возможностью управлять пользователями. Django состоит из приложений. По сути, приложение - это директория с фиксированной структурой (в model.py находятся все классы моделей, view.py - визуальные представления, urls.py - настройки url-адресации, и т.д.)

Как ставить Django

Джанго лучше всего ставить через pip install django. Даже если вы пользуетесь, к примеру, Ubuntu Linux, и django доступен из коробки через apt install django - так лучше не делать - скорее всего установится старая версия django. Вы создадите в ней проект, а потом возникнут проблемы с переносом проекта под более свежую версию. Лучше сразу ставить самую свежую версию django через pip install django. Даже на веб-сервере.

Туториалы

Изучение лучше всего начинать с пошаговых примеров. Как раз тут рассказывается как с нуля написать своё приложение для Джанго.

  1. Самый очевидный туториал - это туториал с официального сайта. Здесь в качестве примера предлагают создать простой опрос. Туториал покрывает все необходимые базовые знания.
  2. Альтернативный туториал предлагается на сайте Мозиллы. Он гораздо сложнее, чем официальный туториал, но я советую  для экономии времени пройти именно его. Как бы не был хорош базовый туториал, при выходе за рамки учебной задачи - всё-равно придётся искать информацию где-то ещё.  Туториал от Mozilla даёт больший начальный запас знаний.

Где искать готовые приложения

Django Packages - каталог приложений для Джанго, удобно рассортированных по категориям.

Памятка команд

  • python manage.py runserver - запуск сервера. По умолчанию адрес 127.0.0.1:8000
  • python manage.py startapp <имя приложения> - создание нового приложения
  • python manage.py makemigrations <имя приложения> - Создать после изменения или создания модели файл скрипт миграции, который обновит базу данных.
  • python manage.py migrate - применить все обновления БД (созданные ранее файлы миграций)

Локализация, перевод и интернационализация

Про локализацию очень хорошо расписано в этой статье.

Здесь же в виде краткого конспекта.

Локализация шаблонов

В начале файла шаблона необходимо подключить библиотеку локализации:

{% load i18n %}

Дальше локализация выполняется вызовом trans:

<h1>{% trans 'TemplateQuarryList' %}</h1>

локалицация view

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

локализация модели

Для локализации имени модели надо добавить туда класс Meta. Предварительно надо не забыть импортировать ugettext_lazy

from django.utils.translation import ugettext_lazy as _
class Book(models.Model):
    class Meta:
         verbose_name = _('bookModel')
         verbose_name_plural = _('bookModel')

В классе задаются имена для единственного и множественного числа.

Почему "bookModel" а не просто "book"? Такой подход поможет потом сэкономить кучу нервов, когда окажется, что в разных контекстах одно и то же английское слово переводится по-разному.

Поля модели переводятся также, по аналогии:

from django.utils.translation import ugettext_lazy as _
class Book(models.Model):
    date = models.DateTimeField(_('bookPublished'))

Непосредственно сам перевод

Для генерации файла перевода, в каталоге со своим приложением нужно:

  1.  Создать директорию locale
  2. Запустить:

django-admin makemessages -l ru

Появится файл locale/ru/LC_MESSAGES/djago.po

Открываем его и добавляем перевод на руский.

Проверяем - не работает! Да, надо скомпилировать файл перевода. Выполняем в корне джанго:

django-admin compilemessages

Авторизация во фронтенде

Собственно, всё рассказывается в туториале от Мозиллы. Вот ссылка на конкретную страницу.

Ещё про систему аутентификаци можно почитать в официальной документации.

Формы

Если у вас простая форма, которая заполняет поля модели и отправляет их по кнопке - HTML код для формы можно не писать.
Можно создать форму, в которой указать тип полей, как указано тут. Можно добавлять и поля которых нет в модели.
Менее универсальный вариант - сделтать форму из модели. Тут даже поля указывать не надо - форма сама возьмёт все поля модели и сделает из этого HTML-форму.

Развёртывание django на сервере

Можно, конечно запустить джанго как это делалось для дебага:

python3 manage.py runserver 127.0.0.1:8000

Но это является в корне неправильным, не оптимизированным и не безопасным. Правильный путь - запускать через UWSGI интерфейс.
Вот статья как запускать Nginx + uwsgi + django. От себя лишь замечу, что надо не забывать выставлять у файлов и директории проекта пользователя www-data. В противном случае долго придётся разбираться с ошибкой от недостатка прав при создании файла сокета.