Создание сайтов на Django, часть 1

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

Для непосвященных, Django — это веб-фреймворк для создания сайтов, написанный на языке Python. Соответственно язык и является одним из основных его преимуществ, так как обеспечивает достаточно высокую производительность. На сегодняшний момент Django считается основным фреймворком Python для разработки веб-сайтов и веб-сервисов.

Для того, чтобы понимать все, что происходит в этой статье, необходимо знать основы ООП, более-менее знать Python и владеть основами работы с командной строкой (Windows или Linux, что больше нравится). В качестве дистрибутивов будут использованы Python 2.7, Django 1.5, и попеременно Ubuntu 13.10 и Windows 7. В целом информация будет применима для всех версий Django, начиная с 1.3.

Сначала нужно раздобыть дистрибутивы. Пользователи Linux могут их установить через менеджер пакетов (Django обычно называется python-django), пользователи Windows скачать Python отсюда и Django отсюда. При этом Python установится через инсталлер, а для Django придется использовать командную строку.
Распакуйте архив, перейдите в командной строке в папку с дистрибутивом и скомандуйте:

setup.py install

т.к. файлы с расширением *.py должны были зарегистрироваться при установке Python, Windows автоматически запустит найдет интерпретатор Python и запустит установку через него.

После того, как все дистрибутивы установлены, мы можем приступить к созданию нашего первого проекта на Django. Для этого существует специальная утилита django-admin.py. Для пользователей Linux она модет звучать как с расширением, так и без (зависит от дистрибутива) и скорее всего она уже зарегистрирована в PATH. Перейдите в
командной строке в каталог, где хотите создать проект и скомандуйте:

django-admin.py startproject mydjangosite

или какое-нибудь другое имя проекта, но помните, что имя должно соответствовать стандартам именования пакетов в Python, которые сходны со стандартами именования переменных.

Пользователей Windows ждет подвох, так как django-admin в PATH не зарегистрирован, и его придется запускать по полному пути. Если устанавливать все по стандартному, то он обычно располагается в папке C:\Python27\Scripts, поэтому скомандуйте:

C:\Python27\Scripts\django-admin.py startproject mydjangosite

Перейдите внутрь папки и ознакомьтесь с содержимым. Внутри неё должен лежать файл manage.py (который послужит нам заменой django-admin), и каталог с именем проекта. Будем называть текущую папку корневой и немного углубимся внутрь устройства этого фреймворка. Он состоит из ядра, вспомогательных библиотек и приложений (apps). При этом сам разработчик пишет преимущественно приложения. Все эти приложения по существу являются пакетами Python, имеют определенную структуру и обычно их размещают в корневой папке проекта (но необязательно). Сейчас у нас есть только одно приложение (скорее псевдо-приложение) — это непосредственно папка с проектом, в которой лежат файлы настроек. Лирическое отступление для обладателей Django 1.3: он каталог с проектом не создает, а помещает все настройки в корневой каталог.

Перейдем в каталог с настройками и увидим там 2 файла (вообще 3 и ещё __init__.py, но нам нужны будут 2) settings.py и urls.py. В settings.py хранятся все настройки. Откроем его (насчет открытия — можно открыть в “блокноте”, но это слишком. Для пользователей Linux рекомендую Geany или какой-нибудь другой текстовый редактор с подсветкой синтаксиса, у пользователей Windows в контекстном меню для файлов *.py должна была появится команда Open with IDLE — это специальный редактор для Python, нам его вполне хватит).

В файле мы увидим множество настроек по умолчанию (на самом деле настроек гораздо больше) но все сразу они пока что не нужны. Остановимся только на нескольких.
Сначала, для удобства, определим каталог, в котором располагается проект. Т. к. Django предпочитает работать с абсолютными путями, мы попытаемся этой “проблемы” избежать. Добавим в начало файла:

from os import path
PROJECT_DIR = path.abspath(path.dirname(__file__))

Далее создадим базу данных для нашего проекта. Django работает с множеством различных СУБД, но для простоты мы воспользуемся SQLite3. Найдем настройку DATABASES, подключим backend и пропишем путь к базе:

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': path.join(PROJECT_DIR, 'db.sqlite'),

Обратите внимание на комментарий, что при использовании sqlite3 нет необходимости заполнять остальные поля. Поэтому мы их и не будем трогать.

Далее спустимся почти в самый низ файла и найдем настройку INSTALLED_APPS. Это как раз тот список приложений, которые подключены к проекту. Не стоит убирать ни одно из тех, что подлючены, но стоит подлючить новые. Для начала следует отметить, что вместе с Django поставляется ряд стандартных приложений, которые находятся в пакете django.contrib. В частности, там есть такой замечательный пакет, как django.contrib.admin, который любезно закомментирован в списке приложений (по-моему, в версии 1.6 уже нет). Он представляет из себя автоматическую админку сайта, которая очень сильно упрощает жизнь. И её надо раскомментировать.

Далее мы подключим еще одно приложение. Оно тоже штатное и называется django.contrib.flatpages. Оно служит для создания простых HTML-страниц, которые без обработки выводятся на сайт.

Итак, в конце переменной INSTALLED_APPS должны появиться два приложения:

INSTALLED_APPS = (
....
'django.contrib.admin',
'django.contrib.flatpages',
)

На этом начальная подготовка файла settings.py закончена. Теперь необходимо подготовить файл url.py. В дальнейшем в этом файле будут прописываться все URL, точнее их шаблоны, которые будет понимать Django. И к URL’ам в свою очередь будут подвязываться процедуры формирования ответа.

Раскомментируем в нем строчки:

from django.contrib import admin
admin.autodiscover()

и самый последний URL:

url(r'^admin/', include(admin.site.urls)),

Этими действиями мы подключили админку.

Прописав приложения в settings.py, мы только прописали приложения. Теперь нужно создать базу данных для этих приложений. Для этого в командной строке из корневой папки выполняем следующую команду:

manage.py syncdb

или

python manage.py syncdb

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

После того, как синхронизация закончится, можно запускать так называемый сервер разработки. Вместе с Python поставляется элементарный веб-сервер, который можно активировать через Django, автоматически подвязав к нему текущий проект. Скомандуйте:

manage.py runserver

и появится сообщение о запущенном сервере. Останосить сервер можно командой Ctrl+C. Теперь можно открывать браузер.

По умолчанию сервер стартует по адресу 127.0.0.1:8000, и так как мы ещё не создали главной станицы, то сразу введем http://127.0.0.1:8000/admin/. В окне входа нужно ввести те данные, которые мы вводили при создании администратора. Перед нами предстанет список приложений. Пока что нам интересно только одно приложение — Flatpages.

Перейдем по ссылке в список страниц, нажмем Add flat page в правом углу чтобы создать новую. И заполним её так, как показано на рисунке:

1-1

и сохраним.

В поле URL указывается адрес, по которому страница будет доступна. Но если мы сейчас введем адрес http://127.0.0.1:8000/home/, то сервер ответит что страница не найдена. Нам необходимо сделать ещё несколько действий, чтобы такие страницы стали доступны.

Для начала небходимо создать шаблон страницы. Для этого внутри каталога проекта (не корневого, а того, что с settings.py) нужно создать каталог templates, внутри flatpages, и внутри файл с именем default.html со следующим содержанием:

<html><head><title>{{ flatpage.title }}</title></head><body>{{ flatpage.content }}</body></html>

Мы создали каталог шаблонов по умолчанию, теперь необходимо указать его в settings.py. Найдем настройку TEMPLATE_DIRS и пропишем там путь до каталога, относительный, по аналогии с базой данных:

TEMPLATE_DIRS = (
path.join(PROJECT_DIR, 'templates'),
)

И добавим еще одну строчку. Чтобы Django отлавливал все URL, которые присутствуют во Flatpages, необходимо подключить промежуточный обработчик (Middleware). Для этого в настройку MIDDLEWARE_CLASSES добавим следующий обработчик:

MIDDLEWARE_CLASSES = (
....
'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
)

Сохраним settings.py. Перезапустим сервер (для надежности, обычно он перезапускается сам, вы при этом снова увидите в командной строке сообщение о старте сервера).
И введем в браузер http://127.0.0.1:8000/home/. Должна отобразиться созданная нами страница.

Если не отобразилась, ещё раз перепроверьте все шаги, которые необходимо было сделать.

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

Исходники на GitHub.


17 responses to “Создание сайтов на Django, часть 1

  • Артур

    Для создания проекта из консоли windows, нужно указывать не django-admin.py а django-admin.exe. И если питон установлен в папке програм файлс, то весь путь заключить в кавычки, так как в имени каталога пробел. Например: «C:\Program Files\Python36\Scripts\django-admin.exe» startproject mydjangosite

  • deadline323

    Большое спасибо за данный урок, все очень подробно и доступно изложено.

  • G. Eugene

    Помогите решить проблему http://dpaste.com/01VEVJ7#

    • truecryer

      Проблема с приложением django.contrib.sites. Но что конкретно, не могу сказать. Во-первых, в предыдущих версиях джанги это приложение было отключено. Поэтому, если проект начинал в версии 1.6, 1.7, то сравни свои настройки с дефолтными настройками в 1.8. Обязательно проверь настройку SITE_ID. Должна быть задана. И попробуй применить миграцию — manage.py migrate.

  • Alexey

    В 1.8 надо добавить строку SITE_ID = 1
    Спасибо автору!

    • truecryer

      Че, вернули? Вроде с версии 1.5 не надо было в настройках ставить. Хотя это даже лучше — очень много приложений завязаны на contrib.sites.

  • jtadmin

    давно искал хороший мануал, мучился даже с первой страницей на Django, а тут все доходчиво объяснено. Жаль всего 3 урока

  • Chocobo

    для Django 1.6.5 — необходимо также добавить строку:

    ‘django.contrib.sites’,

    в INSTALLED_APPS, иначе возникает ошибка:

    CommandError: One or more models did not validate:
    flatpages.flatpage: ‘sites’ has an m2m relation with model , which has either not been installed or is abstract.

    • truecryer

      Да, эта статья для версии 1.5. В 1.6 sites убрали из дефолтного приложения, но flatpages до сих пор от него зависит.

      • Chocobo

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

        В частности:
        Каталог Templates в 1.6.5 нужно размещать уровнем выше

        🙂

        • truecryer

          Каталог templates, во-первых, может быть не один, а во-вторых, его надо размещать там, где прописал. В 1.6 появилась дефолтная переменная BASE_DIR в настройках, которая указывает на один каталог выше
          BASE_DIR = dirname(dirname(__file__)).
          Раньше ее прописывали вручную и в другом виде:
          BASE_DIR = abspath(dirname(__file__)).
          Отсюда и данная рассогласованность, которая на самом деле рассогласованностью не является.
          Я со своей стороны рекомендую использовать второй (старый) вариант, поскольку в первом случае имена каталогов с шаблонами и статиками могут начать конфликтовать с именами приложений

  • Tolik

    Выдается ошибка в файле URLS.PY вот на этой строке : from django.contrib import admin
    ставил Пайтон и Джанго не один раз. ошибка именно на этой строке. не подскажете, в чем магия? )

    • truecryer

      Ну ошибку ты не дописал, ошибка после эксепшена идёт. А так на первый взгляд строка выглядит верно.

  • zaemiel

    Отличный цикл статей.
    Спасибо за труд.

  • Создание сайтов на Django, часть 2. MVT или MVC. Модели | TrueCryer's Blog

    […] прошлой части мы запустили простой сайт на базе встроенных […]

Оставьте комментарий