правила игры, обзор настолки или как играть
Кол-во игроков От 2 до 4 Время партии От 5 минут Сложность игры ЛегкаяДженга был разработана Скотт Лесли. Игру придумали в ее семье и вместо деревянных блоков использовались различные кубики. Переводиться дженго — «строить!». Позже игра была выкуплена компанией Parker Brothers. В игру могут играть от 2 до 4 игроков.
Инвентарь необходимый для игры в Дженгу: 54 деревянных блока (высота одного блока равно половине ширины).
Цель игры
- Необходимо вытаскивать блоки с нижней части башни и при этом избежать падения самой башни.
Дженга: правила игры
- Перед началом игры необходимо подготовить башню, то есть выстроить восемнадцать этажей.
- Каждый этаж — это 3 деревянных блока, выстроенные параллельно и вплотную друг к друг.
- Следующий за ним этаж должен быть построен перпендикулярно предыдущему этажу.
- Начинает игрок, который строил башню.
- Каждый игрок по очереди вытаскивает деревянный блок из любого этажа, кроме двух верхних.
- Вытаскивать блок можно только одной рукой.
- Придерживать башню башню нельзя.
- Любой блок можно перестать двигать, если это может привести к падению башни.
- Проигрывает тот игрок, в чей ход произошло падение башни.
Больше интересного
add-hobby.ru
Дженга секреты игры, как выиграть!
Многие хоть раз пробовали себя в увлекательной игре Дженга, где основным ключом к успеху являются ловкость рук и ясный ум. Популярная игра родом из 70-х, ее придумала англичанка Лесли Скотт, когда была еще маленькой. Обычно детей привлекают к игре с 5-6 лет, но по опыту, и развитая трехлетка способна понять правила.
Стандартно для игры используется 54 деревянных брусочка, реже – 48 или 60. Ширина каждой деревяшки в три раза меньше длины и два раза больше высоты. Это важно для того, чтобы построить ровную башню. Цель игры – из построенной башни по очереди достать бруски и переложить их наверх. С каждым ходом шаткость конструкции растет вверх.
Правила игры
Играть можно от 2-х человек, оптимальное количество игроков – 3-5. Для начала нужно выбрать того, что построит конструкцию. Он и будет делать первый ход. Участник выкладывает деревяшки в 18 этажей, по 3 на каждом. В первый ряд бруски укладываются параллельно, во второй – перпендикулярно и так по очереди.
По часовой стрелке участники вытягивают по одному элементу из конструкции (исключение составляют первые 2 верхних этажа) и размещают его вверху башни. В игре участвует только одна рука: придерживать, вытаскивать двумя запрещено. После каждого действия игрока необходимо подождать 10 секунд – если конструкция не падает, право хода достается следующему. Партия оканчивается, когда конструкция рушится – игрок, чей ход был в момент падения, считается проигравшим.
Дженга — секреты игры
Дженга – не та игра, где везет новичкам. Однако для победы Вам потребуется не только опыт, но и внимательности, а также везение. Существует несколько советов, которые помогут Вам выйти из игры победителем:
- помните, что свободные элементы не обязательно расположены наверху или по краям. Не забывайте проверять середину башни;
- боковые бруски безопаснее выковыривать, а центральные – выталкивать;
- чем плавнее и мягче будут Ваши движения, тем больше шансов, что конструкция не рухнет. Резкие движения опасны разрушением;
- когда конструкция начинает наклоняться, осмотрите противоположную сторону – там появятся несколько свободных брусков;
- не забывайте, что Ваша цель – выиграть любой ценой, поэтому подставляйте противников, рискуйте и усугубляйте наклон башни. Правда, прежде подумайте, не завалится ли конструкция на Вашем ходе.
Эти небольшие хитрости помогут Вам стать победителем. В дополнении отметим, что эта увлекательная игра рекомендуется специалистами для домашних коллекций настольных игр, так как положительно влияет на мозг и мелкую моторику.
Интересно:
valimo.ru
Настольная игра «Джанго» («Башня»): плавила, комплектация, польза
Настольная игра «Джанго» («Башня») не зря стала популярной как среди детей и подростков, так и взрослых.История разработки
Настольная игра Дженга была разработана британским гейм дизайнером Лесли Скотт и выпущена в 1983 году. На создание игры большое влияние оказали её родные, ведь в основу идеи легла игра с кубиками, популярная в семье ещё в начале 70х годов. Родной страной Лесли считается Танзания, именно поэтому в названии своей разработки использовался суахили. На сегодняшний день игра пользуется большой популярностью и существует много её разновидностей, а сами брусочки могут быть прямоугольными, овальными, разноцветными. Оригинальная игра же представлена деревянными блоками. Заказать можно настольную игру Джанго тут https://3d-toy.ru/catalog/educational-games/django-board-game-to-buy/.
Комплектация
Игра состоит из 54 прямоугольных деревянных брусочков, инструкции и специального рукава для построения башни, необходимой для начала игры. Их внешняя поверхность отшлифована, без какого-либо покрытия, что позволяет увеличить сцепление между ними и удержать составляемую конструкцию. Параметры оригинального блока составляют 15*24*75мм.
Подготовка к игре
Перед началом игры следует выложить все брусочки на плоской, ровной поверхности и составить башню высотой в 18 блоков. Каждый ярус несёт в себе три блока, расположенных параллельно друг другу. Каждый очередной ряд выкладывается перпендикулярно предшествующему. Далее следует убедиться, что башня расположена прочно прямым углом, и при необходимости выровнять её.
Правила игры
Игра рассчитана на двух и более участников, возрастом от 6 лет. Игроки располагаются вокруг башни и поочередно вытаскивают по одному бруску из любого ряда, кроме самого верхнего. Далее блок укладывается сверху башни. Запрещается начинать строительство нового уровня, не завершив укладку трёх блоков в ряд, также нельзя использовать блоки из ряда, предшествующего недостроенному.
Прикасаться к башне разрешается только одной рукой, не удерживая её при совершении хода. Блоки можно тянуть, выталкивать, постукивать по ним или расшатывать. Участники совершают свои ходы в соответствии с очередностью.
Проигравшим считается игрок, обрушивший башню во время своего хода.
Полезные качества игры
Игра позволяет развить логику, терпение, увеличить концентрацию внимания, мелкую моторику рук. При этом она не заставляет вырабатывать стратегию, испытывать умственное напряжение, поэтому игра позволяет полностью расслабиться и обеспечит весёлое времяпрепровождение.
Разновидности игры
Существует множество модификаций игры, например, с использованием классических брусочков трех цветов и игровых костей. На кубиках располагаются надписи и цвета, указывающие, из какой части башни (начало, верх или середина), должен быть вытащен брусок, а также их количество, она носит название «Бросай и ходи». Наиболее привлекательной для детей может являться игра «Девичьи разговоры», в составе которой все блоки окрашены в малиновые и розовые цвета и несут на себе множество вопросов из девичьих тетрадок – анкет.
На сегодняшний день рынок переполнен множеством различных вариантов игры, и вы обязательно сможете выбрать тот самый вариант, подходящий именно вам.
intellect-video.com
Эффективный Django. Часть 1 / Habr
Представляю вам перевод статей о Django с сайта effectivedjango.com. Наткнулся я на этот сайт во время изучения данного фреймворка. Информация размещенная на этом ресурсе показалась мне полезной, но так как нигде не нашел перевода на русский, решил сделать сие доброе дело сам. Этот цикл статей, как мне думается, будет полезен веб-разработчикам, которые делают только первые шаги в изучении Django.
- Введение
- Эффективный Django. Руководство
- Тестирование в Django
- Понимание Middleware’ов
- Базы данных и модели
- Представления-классы (CBV)
- Формы
Django — это популярный, мощный фреймворк на языке Python. Он имеет множество «батареек«, и позволяет сразу начать разработку. Однако вся эта мощь означает, что вы можете написать низкопробный код, который будет казаться рабочим. Так что же подразумевается под Эффективным Django? Под Эффективным Django будем понимать использование Django таким образом, чтобы написанный код был
«Связный» код — это код, который сосредоточен на выполнении одной вещи, только одной единственной вещи. Это значит, что когда вы пишете функцию или метод — написанный вами код должен делать что-то одно и делать это хорошо.
Это непосредственно относится к написанию тестируемого кода: код, который делает много вещей, достаточно часто является чересчур сложным для тестирования. Когда я ловлю себя на мысли: «Хорошо, этот кусок кода слишком сложен, чтобы писать для него тесты — это просто не стоит потраченных усилий» — вот сигнал к тому, чтобы вернутся назад и сосредоточиться на упрощении. Тестируемый код — такой код, который позволяет просто писать для него тесты; код, в котором легко найти проблемы.
И наконец, мы хотим писать масштабируемый код. Это означает не просто масштабировать его в терминах исполнения, но так же увеличивать в терминах команды и командного понимания. Хорошо протестированные приложения проще для понимания другими (и проще для изменения ими), что подразумевает большую возможность улучшить ваше приложение, путем добавления новых инженеров.
Моя цель — убедить вас в важности этих принципов, и предоставить примеры того, как следуя им, построить более стойкое Django-приложение. Я собираюсь последовательно пройти через процесс построения приложения для управления контактами, рассказывая про решения и стратегию тестирования, которые я использую.
Эти документы являются сочетанием заметок и примеров подготовленных для PyCon 2012, PyOhio 2012, и PyCon 2013, а также для web-разработки Eventbrite. Я все еще работаю над объединением их в один документ, но надеюсь вы найдете их полезными.
Примеры кода для этого руководства доступны на github’е. Отзывы, предложения и вопросы можете присылать на [email protected].
Этот документ доступен на сайте, а также в форматах PDF и EPub.
Видео этого руководства с PyCon можно посмотреть на YouTube.
1.1. Ваша среда разработки
Когда ведется разговор о вашей среде разработки, существует три важных факта, которые необходимо иметь в виду: изоляция, предопределенность и сходство. Каждый из них важен и все они взаимодействуют друг с другом согласованно.
Изоляция означает, что вы не сможете случайно воспользоватся инструментами или пакетами установленными вне вашего окружения. Это особенно важно, когда подобное происходит с чем-то, похожим на пакеты Python с расширениями написанными на C: если вы используете что-то установленное на системном уровне и не знаете об этом, то при развертывании или распространении своего кода вы можете обнаружить, что он работает не так как предполагалось. Инструменты наподобие virtualenv могут помочь создать нечто похожее на изолированную среду.
Ваша среда предопределена, если вы уверены в том, на какую версию ваших зависимостей вы полагаетесь и сможете ли вы наверняка воспроизвести системное окружение.
И на конец, сходство с производственной средой или средой сервера разработки означает, что везде установлена одна и та же операционная система (возможно даже одинаковый выпуск) и вы используете одинаковые инструменты как для конфигурирования вашей среды разработки, так и для конфигурирования вашей производственной среды. Это отнюдь не необходимость, но если вы строите большое и сложное программное обеспечение — сходство будет полезно для уверенности в том, что все проблемы, которые вы можете увидеть на «боевом» сервере, воспроизводимы в той среде, где вы ведете разработку. К тому же сходство ограничивает область исследования вашего кода.
1.1.1. Изоляция
- Мы хотим избежать использования неизвестных зависимостей или неизвестных версий.
- virtualenv предоставляет простой путь для работы над проектом, без использования системных site-packages.
1.1.2. Предопределенность
- Предопределенность означает управление зависимостями.
- Выберете один из инструментов и используйте как при разработке, так на «боевом» сервере:
- Определите точные версии зависимостей.
Вы можете точно определить версии используя либо версию пакета на PyPI, либо же определенную ревизию (SHA в git, номер ревизии в Subversion и т. д.). Это гарантирует вам возможность получить в точности те же версии пакетов, которые вы используете при тестировании.
1.1.3. Сходство
- Работа в среде, похожей на ту, где вы будете разворачивать ваше приложение и пытаться обнаружить проблемы.
- Если вы разрабатываете что-то, требующее дополнительных сервисов — сходство становится еще более важным.
- Vagrant — это инструмент для управления виртуальными машинами, позволяющий вам легко создавать окружение отделенное от вашего повседневного окружения.
1.2. Настройка вашего окружения
1.2.1. Создание чистого рабочего пространства
Примечание переводчика:
Для начала создадим каталог (tutorial
), в котором будем работать:~$ mkdir tutorial ~$ cd tutorial ~/tutorial$ mkdir venv project
В каталогеvenv
будет находится наше виртуальное окружение, а в каталогеproject
— Django-проект
~/tutorial$ virtualenv --prompt="(venv:tutorial)" ./venv/
New python executable in ./venv/bin/python
Installing setuptools............done.
Installing pip...............done.
~/tutorial$ source ./venv/bin/activate
(venv:tutorial)~/tutorial$
1.2.2. Создание файла зависимостей
Создайте файл
requirements.txt
в директории tutorial
с единственной строкой (зависимостью) в нем:Django==1.6.7
Примечание переводчика:
В случае, если вы хотите использовать последнюю версию Django (1.7 — на момент написания перевода) — вместо строкиDjango==1.6.7
оставьте простоDjango
— pip установит последнюю доступную версию.
1.2.3. Установка зависимостей
А теперь мы можем использовать pip для установки зависимостей:
(venv:tutorial)~/tutorial$ pip install -U -r requirements.txt
Downloadping/unpacking Django==1.6.7 (from -r requirements.txt (line 1))
Downloading Django-1.6.7.tar.gz (6.6MB): 6.6MB downloaded
Running setup.py egg_info for package Django
warning: no previously-included files matching ’__pycache__’ found under directory ’*’
warning: no previously-included files matching ’*.py[co]’ found under directory ’*’
Installing collected packages: Django
Running setup.py install for Django
changing mode of build/scripts-2.7/django-admin.py from 644 to 755
warning: no previously-included files matching ’__pycache__’ found under directory ’*’
warning: no previously-included files matching ’*.py[co]’ found under directory ’*’
changing mode of /home/nathan/p/edt/bin/django-admin.py to 755
Successfully installed Django
Cleaning up...
1.3. Начало проекта Django
Когда здание находится в процессе постройки, строительные леса часто используются для поддержания структуры до того как строительство будет завершено. Строительные леса могут быть временными или они могут служить частью фундамента здания, но несмотря на это, они представляют некоторую поддержку когда вы только начинаете работу.
Django, как и многие web-фреймворки, представляет скаффолдинг для вашей разработки. Это происходит при помощи принятия решений и предоставления отправной точки для вашего кода, что позволяет вам сосредоточится на проблеме, которую вы пытаетесь решить, а не на том, как разобрать HTTP-запрос. Django предоставляет скаффолдинг как для работы с HTTP, так и для работы с файловой системой.
HTTP-скаффолдинг управляет, например, преобразованием HTTP-запроса в объект языка Python, а также предоставляет инструменты для более простого создания серверных ответов. Скаффолдинг файловой системы иной: это набор соглашений по организации вашего кода. Эти соглашения облегчают добавление новых инженеров в проект, так как инженеры (гипотетически) уже понимают как организован код. В терминах Django, проект — это конечный продукт, и он объединяет внутри себя одно или несколько приложений. В Django 1.4 было изменено то, как проекты и приложения размещаются на диске, что облегчило разъединение и повторное использование приложений в разных проектах.
1.3.1. Создание проекта
Django устанавливает в систему скрипт
django-admin.py
для обработки задач скаффолдинга. Для создания файлов проекта используется задача startproject
. Мы определим имя проекта и имя директории, в которой хотим разместить проект. Так как, мы уже находимся в изолированной среде, можно просто написать:Примечание переводчика:
Перейдем директорию~/tutorial/project/
и в дальнейшем будем работать только из этой директории (под$
далее будем подразумевать~/tutorial/project/$
):(venv:tutorial)~/tutorial/$ cd project
(venv:tutorial)$ django-admin.py startproject addressbook .
Созданный проект имеет следующую структуру
manage.py
./addressbook
__init__.py
settings.py
urls.py
wsgi.py
1.3.2. Скаффолдинг проекта
manage.py
— является ссылкой на скриптdjango-admin
, но с уже предустановленными переменными окружения, указывающими на ваш проект, как для чтения настроек оттуда, так и для управления им при необходимости;settings.py
— здесь находятся настройки вашего проекта. Файл уже содержит несколько разумных настроек, но база данных не указана;urls.py
— содержит URL’ы для маппирования (отображения) представлений: мы вскоре (в дальнейших главах) поговорим об этом подробнее;wsgi.py
— это WSGI обёртка для вашего приложения. Этот файл используется сервером разработки Django и возможно другими контейнерами, такими какmod_wsgi
,uwsgi
и др. на «боевом» сервере.
1.3.3. Создание приложения
(venv:tutorial)$ python ./manage.py startapp contacts
Созданное приложение имеет следующую структуру:
./contacts
__init__.py
models.py
tests.py
views.py
- Начиная с Django 1.4, приложения размещаются внутри пакета с проектом. Это замечательное улучшение, особенно когда приходит время разворачивать проект на «боевом» сервере;
models.py
будет содержать Django ORM-модели для вашего приложения;views.py
будет содержать код представлений;tests.py
будет содержать написанные вами модульные и интеграционные тесты.- Django 1.7:
admin.py
будет содержать модель для административного интерфейса. - Django 1.7:
migrations/
содержит файлы миграций
Примечание переводчика:
На текущий момент наша директория~/tutorial/
содержит файл зависимостей (requirements.txt
), директорию с виртуальным окружением (venv/
), один проект (project/addressbook
), одно приложение (project/contacts
) и имеет следующее содержание:~/tutorial/ requirements.txt venv/ ... project/ manage.py addressbook/ __init__.py settings.py urls.py wsgi.py contacts/ __init__.py models.py tests.py views.py
2.1. Конфигурирование базы данных
Django поддерживает «из коробки» MySQL, PostgreSQL, SQLite3 и Oracle. SQLite3 входит в состав Python начиная с версии 2.5, так что мы будем использовать его в нашем проекте (для простоты). Если вы хотите, к примеру, использовать MySQL, то нужно добавить mysql-python в ваш
requirements.txt
.Для того чтобы в качестве базы данных использовать SQLite, отредактируйте определение DATABASES
в файле addressbook/settings.py
. Файл settings.py содержит настройки Django для нашего проекта. В нем есть несколько настроек, которые вы обязаны указать — например DATABASES
— а так же другие, необязательные, настройки. Django устанавливает некоторые настройки сам, когда генерирует проект. Документация содержит полный список настроек. К тому же вы можете добавить свои собственные настройки, если это необходимо.
Для использования SQLite нам нужно указать движок (ENGINE
) и имя базы (NAME
). SQLite интерпертирует имя базы как имя файла для базы данных:
DATABASES = {
'defaults': {
'ENGINE': 'django.db.backends.sqlite3,' # ’postgresql_psycopg2’, ’mysql’, ’sqlite3’ or ’oracle'.
'NAME': os.path.join(BASE_DIR, 'address.db'),
'USER': '', # Not used with sqlite3.
'PASSWORD': '', # Not used with sqlite3.
'HOST': '', # Set to empty string for localhost. Not used with sqlite3.
'PORT': '', # Set to empty string for default. Not used with sqlite3.
}
}
Заметьте, что движок базы данных указан строкой, а не прямой ссылкой на объект Python. Это сделано по той причине, что файл настроек должен быть легко импортирован не вызывая сторонних эффектов. Вы должны избегать добавления вызовов import в этот файл.
Вам редко придется непосредственно импортировать файл настроек: Django импортирует его за вас, и делает настройки доступными как django.conf.settings
. Вы, как правило, импортируете настройки из django.conf
:
from django.conf import settings
2.2. Создание модели
Модели Django отображают (грубо говоря) таблицы базы данных, и предоставляют место для инкапсулирования бизнес-логики. Все модели являются наследниками базового класса Model и содержат поля определений. Давайте создадим простую модель
Contacts
для нашего приложения в файле contacts/models.py
:from django.db import models
class Contact(models.Model):
first_name = models.CharField(
max_length=255,
)
last_name = models.CharField(
max_length=255,
)
email = models.EmailField()
def __str__(self):
return ' '.join([
self.first_name,
self.last_name,
])
Django предоставляет набор полей для отображения типов данных и различных правил валидации. К примеру,
EmailField
, который мы использовали, является отображением на колонку с типом CharField
, но добавляет валидацию данных.После того, как вы создали модель, необходимо дополнить вашу базу данных новыми таблицами. Команда Django syncdb
смотрит установленные модели и создает (если нужно) таблицы для них:
Примечание переводчика:
Django предложит создать суперпользователя для андминки, которая включена в этой версии по умолчанию. Воспользуйтесь его предложением.
Примечание переводчика:
С версии Django 1.7 во фреймворк добавлена нативная поддержка миграций и командаsyncdb
объявлена устаревшей. Так что будьте так любезны, воспользуйтесь командойmigrate
вместоsyncdb
.
(venv:tutorial)$ python ./manage.py syncdb
Creating tables ...
Creating table django_admin_log
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_groups
Creating table auth_user_user_permissions
Creating table auth_user
Creating table django_content_type
Creating table django_session
You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): yes
Username (leave blank to use 'bjakushka'):
Email address:
Password:
Password (again):
Superuser created successfully.
Installing custom SQL ...
installing indexes ...
Installed 0 object(s) from 0 fixture(s)
(venv:tutorial)$
Примечание переводчика:
Если вы используете Django версии 1.7 и выше — вывод будет следующий:(venv:tutorial)$ python ./manage.py migrate Opperation to perform: Apply all migrations: admin, contenttypes, auth, sessions Running migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying sessions.0001_initial... OK (venv:tutorial)$
Однако нашей таблицы с контактами нигде не видно. Причина этого состоит в том, что нам нужно еще указать проекту использовать приложение.
Настройка INSTALLED_APPS
содержит список приложений, используемых в проекте. Этот список содержит в себе строки, которые отображают пакеты Python. Django будет импортировать каждый из указанных пакетов, а потом смотреть модуль models
. Давайте добавим наше приложение contacts
в настройки проекта (addressbook/settings.py
):
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'contacts',
)
После этого запустите
syncdb
снова:Примечание переводчика:
Для Django версии 1.7 и выше вам нужно будет запустить сначала командуmakemigrations
— для создания миграций на основе изменений в моделях, а после этого выполнить командуmigrate
— для того чтобы применить созданные миграции.
(venv:tutorial)$ python ./manage.py syncdb
Creating tables ...
Creating table contacts_contact
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)
(venv:tutorial)$
Примечание переводчика:
Вывод для Django 1.7 и выше:(venv:tutorial)$ python ./manage.py makemigrations Migrations for 'contacts': 0001_initial.py: - Create model Contact (venv:tutorial)$ python ./manage.py migrate Opperation to perform: Apply all migrations: admin, contenttypes, sessions, auth, contacts Running migrations: Applying contacts.0001_initial... OK (venv:tutorial)$
Заметьте, что Django создает таблицу с именем
contacts_contact
: по умолчанию Dj ango дает таблицам имена используя комбинацию имени приложения и имени модели. Вы можете изменить это с помощью опций модели Meta.2.3. Взаимодействие с моделью
Теперь, когда модель синхронизирована с базой данных мы можем взаимодействовать с нею используя интерактивную оболочку:
(venv:tutorial)$ python ./manage.py shell
Python 2.7.3 (default, Mar 14 2014, 11:57:14)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from contacts.models import Contact
>>> Contact.objects.all()
[]
>>> Contact.objects.create(first_name='Nathan', last_name='Yergler')
<Contact: Nathan Yergler>
>>> Contact.objects.all()
[<Contact: Nathan Yergler>]
>>> nathan = Contact.objects.get(first_name='Nathan')
>>> nathan
<Contact: Nathan Yergler>
>>> print nathan
Nathan Yergler
>>> nathan.id
1
Здесь использовалось несколько новых штук. Во-первых, команда
manage.py shell
запускает для нас интерактивную оболочку Python’а с правильно установленными путями для Django. Если вы попробуете запустить интерпретатор Python и просто импортировать ваше приложения, будет выброшено исключение, потому что Django не знает, какие настройки использовать, и не может отобразить экземпляры модели на базу данных.Во-вторых, здесь использовалось свойство objects
нашей модели. Это менеджер модели. Так, если один экземпляр модели является аналогией для строки в базе, то менеджер модели — аналогией для таблицы. По умолчанию менеджер модели предоставляет функциональность запросов и может быть настроен. Когда мы вызываем all()
, filter()
или сам менеджер, возвращается объект QuerySet
. QuerySet
является итерируемым объектом и загружает данные из базы по необходимости.
И последнее — выше использовалось поле с именем id
, которое мы не определяли в нашей модели. Django добавляет это поле как первичный ключ для модели, но только в том случае если вы сами не определили какое поле будет первичным ключом.
2.4. Написание тестов
В нашей модели определен один метод,
__str__
, так что настало время писать тесты. Метод __str__
будет использоваться всего лишь в нескольких местах, и, вполне возможно, полностью будет показан конечному пользователю. Для этого метода стоит написать тест, пока мы понимаем как он работает. Django создал файл tests.py
когда создавал приложение, так что мы добавим первый тест в этот файл, приложения contacts
.from django.test import TestCase
from contacts.models import Contact
class ContactTests(TestCase):
"""Contact model tests."""
def test_str(self):
contact = Contact(first_name='John', last_name='Smith')
self.assertEquals(
str(contact),
'John Smith',
)
Вы можете запустить тесты для вашего приложения используя команду
manage.py test
:(venv:tutorial)$ python ./manage.py test
Если вы запустите это, то увидите что выполнилось около 420 тестов. Это удивляет, так как мы написали только один. Произошло это потому, что по умолчанию Django запускает тесты для всех установленных приложений. Когда вы добавляли приложение
contacts
в наш проект, то могли увидеть, что там по умолчанию были добавлены несколько встроенных приложений Django. Дополнительные 419 тестов были взяты оттуда.Примечание переводчика:
В нашем случае (при использовании версии Django 1.6.7) предыдущий абзац несколько устарел: запустится только один тест — тот который мы создали. Вывод команды будет такой как указано ниже.
Если же вы захотите запустить тесты для определенного приложения — укажите имя приложения в команде:
(venv:tutorial)$ python manage.py test contacts
Creating test database for alias ’default’...
.
----------------------------------------------------------------------
Ran 1 tests in 0.001s
OK
Destroying test database for alias ’default’...
(venv:tutorial)$
Еще одна интересная вещь на заметку, прежде чем двигаться дальше — первая и последняя строка вывода:
Creating test database
и Destroying test database
. Некоторым тестам необходим доступ к базе данных, и поскольку мы не хотим мешать тестовые данные с «реальными» (по разным причинам, не последней из которых является предопределенность), Django услужливо создает тестовую базу для нас, прежде чем запускать тесты. По существу, создается новая база данных, и потом запускается syncdb
для нее. Если тестовый класс является потомком класса TestCase
(как у нас), Django так же сбросит данные в значения по умолчанию после запуска каждого теста, так что изменения в одном из тестов не затронут другие.2.5. Резюме
- Модель определяет поля в таблице, и содержит бизнес-логику.
- Команда
syncdb
создает таблицы в вашей базе данных из моделей. В Django версии 1.7 и выше вместо командыsyncdb
необходимо использовать сначала командуmakemigrations
— для создания миграций, а после этого командуmigrate
— для внесение изменений в базу. - Менеджер модели позволяет вам оперировать коллекциями экземпляров: запросы, создание и т. д..
- Пишите модульные тесты для методов, которые вы добавили в модель.
- Команда управления
test
запускает модульные тесты на выполнение.
Примечание переводчика:
Для того чтобы протестировать наше, пока еще пустое, приложение нужно выполнить следующую команду:(venv:tutorial)$ python ./manage.py runserver 0.0.0.0:8080
Это запустит встроенный сервер, функционал которого любезно предоставляет нам Django. В параметрах послеrunserver
указывается ip-адрес и порт, который будет слушаться работающим сервер. В нашем случае сервер будет принимать запросы от всех ip-адресов при обращении на 8080 порт.Я использую для разработки домашний сервер с внутренним IP 192.168.1.51. Так что для того что-бы увидеть результат работы сервера разработки в браузере я захожу по адресу http://192.168.1.51:8080/. Вы же должны подставить адрес своего сервера.
Как думаете, нужно ли продолжать перевод остальных глав? Оказался ли перевод для Вас полезен?
Буду рад конструктивной критике в комментариях.
Об ошибках и неточностях перевода прошу сообщать в личном сообщении.
Использованное в начале поста изображение создано как вариация изображения пользователя MaGIc2laNTern
habr.com
Плюсы и минусы Django
Вы разработчик? Тогда очевидно, что вам нужен лучший язык программирования. Но определение лучшего языка и инструментов – непростая задача. Слышали ли вы о Django? Или, по крайней мере, знакомы ли вы с его минусами и плюсами? Используя данный инструмент, кажется, что все становится на свои места очень быстро и эффективно.
Почему Django?
Когда у вас возникает определенная мысль, трансформировать ее на языке программирования и предать ей реальную форму при помощи Django займет всего несколько минут. То, что Django находится в свободном доступе, дает возможность заметно упростить процесс веб разработки, так как разработчик может сфокусироваться на процессе дизайна и разработке функционала приложения. Таким образом, Django – это идеальный инструмент для стартапов, когда веб дизайн должен отображать концепцию и цели компании.
Django в центре внимания
Django появился в 2005 году, и постепенно стал одним из лучших фреймворков, который помогал и помогает тысячам разработчиков выполнять ту или иную работу в течение нескольких минут. Изначально Django был фреймворком для языка Python, с отличным функционалом, Django заметно упростил ряд сложностей в разработке веб приложений, придав данной работе более упрощенный подход
Python и его популярность
Хорошо известно, что Python является одним из самых используемых языков программирования благодаря простоте в изучении, дизайну и гибкости, что делает его практически совершенным языком программирования. Существует ряд причин, по которым его можно называть такими громкими словами.
- Простота в изучении
- Чистота и читаемость
- Разносторонность
- Быстрота написания
- Цельный дизайн
Однако, Python работает на собственной философии, называемой «Дзен Python». Эта философия дает ему уникальную форму, не имеющую аналогов в других языках программирования. Опираясь на эти принципы, разработчики могут создавать код высшего сорта.
Плюсы Django
Я уже достаточно расхвалил Python и его преимущество, так что давайте сфокусируемся на преимуществах Django, который является не только быстрым решением в веб разработке, включающим все необходимое для качественного кода и прозрачного написания, но также и отличной платформой для работы с клиентурой того или иного бизнеса, а так же разработчиков.
- Быстрота: Django был разработан, чтобы помочь разработчикам создать приложение настолько быстро, на сколько это возможно. Это включает в себя формирование идеи, разработку и выпуск проекта, где Django экономит время и ресурсы на каждом из этих этапов. Таким образом, его можно назвать идеальным решением для разработчиков, для которых вопрос дедлайна стоит в приоритете.
- Полная комплектация: Django работает с десятками дополнительных функций, которые заметно помогают с аутентификацией пользователя, картами сайта, администрированием содержимого, RSS и многим другим. Данные аспекты помогают осуществить каждый этап веб разработки.
- Безопасность: Работая в Django, вы получаете защиту от ошибок, связанных с безопасностью и ставящих под угрозу проект. Я имею ввиду такие распространенные ошибки, как инъекции SQL, кросс-сайт подлоги, clickjacking и кросс-сайтовый скриптинг. Для эффективного использования логинов и паролей, система пользовательской аутентификации является ключом.
- Масштабируемость: фреймворк Django наилучшим образом подходит для работы с самыми высокими трафиками. Следовательно, логично, что великое множество загруженных сайтов используют Django для удовлетворения требований, связанных с трафиком.
- Разносторонность: менеджмент контента, научные вычислительные платформы, даже крупные организации – со всем этим можно эффективно справляться при помощи Django.
PHP против Python
PHP можно назвать самым сильным конкурентом Python, оба эти языка очень популярны. Однако у Django есть парочка роялей в кустах, которыми не может похвастаться PHP. Нередко эти преимущества являются решающими для разработчиков. Выбор между PHP и Python – не самая простая задача, надеюсь следующие сравнения помогут вам сделать объективный вывод:
- Лучший дизайн: PHP был разработан специально для веб разработки, но Django базируется на более надежном языке. Хороший код проще написать в Python, в сравнении с PHP.
- Python и долгосрочность: PHP очень хорош в краткосрочной перспективе. Однако, когда вы проходите начальную фазу, вам может понадобиться язык с более глубокими возможностями. Здесь Python выступает в роли явного фаворита.
- Лучший Веб Фреймворк: Рынок наполнен великим множеством замечательных фреймворков. Однако это не касается долгосрочной ценности. И Django в данном случае является явным победителем. Хотя и PHP может похвастаться со своими Laravel, Yii, Symfony.
- Фактор читаемости: PHP следует классическому подходу, но у Python более строгие правила идентификации. Отсюда выбирайте, что лучше.
- Простой синтаксис: написание кода в Python происходит намного проще и быстрее.
- Инструменты для лечения багов: пакеты Python содержат все необходимые инструменты для исправления неполадок.
- Управление пакетам: в Python это реализовано весьма эффективно: вы можете писать, читать и делиться пакетами таким образом, что другие разработчики могут использовать их в других приложениях.
- Говорим Python, подразумеваем «Общее Назначение»: В то время как PHP используется для веб разработки, Python может быть использован для различных целей, также стоит отметить, что вы можете работать как онлайн, так и оффлайн.
Минусы
Минусы всегда идут за руку с плюсами. Давайте рассмотрим, почему Django нельзя назвать безупречным:
- Использование шаблона маршрутизации с указанием URL
- Django слишком монолитный
- Все базируется на ORM Django
- Компоненты развертываются совместно
- Необходимо умение владеть всей системой для работы
Подведем итоги
Существует очень много плюсов и минусов Django, не упомянутых в данной статье, однако, когда рассматривается проект с дедлайном, использование Django для решения поставленной задачи – грамотное решение. Более того, для ускорения рабочего процесса, есть возможность установить пользовательскую кастомную конфигурацию. Ранее, когда разработка кода требовала большого количества времени, такая возможность позволила заметно упростить этот процесс. Стоимость разработки снизилась практически на 80%, а необходимость в аутсорсинге вообще отпала. Но погодите, делает ли это Django лучшим? Что-ж, в некоторых странах определенно попытаются передать Django на аутсорс. Кому? Скорее всего, низкоквалифицированным и дешевым разработчикам.
python-scripts.com
Как создать повторно применяемое приложение — Документация Django 1.7
В продолжение Части 6 мы будем совершенствовать наше приложение Web-poll. Нам предстоит сделать настоящий пакет Python, который можно будет повторно использовать в новых проектах, а главное делиться им с другими разработчиками.
Если вы новичок и все ещё не выполняли занятия с 1 по 6 часть, мы настоятельно рекомендуем сделать это. Весь дальнейший материал опирается на предыдущие главы.
Смысл многократного использования
Большая часть работы уходит на проектирование, сборку, тестирование и конечно же поддержку веб приложения/компонента. У многих Python и Django проектов существуют схожие задачи и проблемы. Вот было бы здорово не повторять однажды проделанную работу, а сохранить её и использовать в будущем. Не правда ли?
Многократное использование — часть философии Python. К примеру, для тех кто ещё не знает что такое The Python Package Index (PyPI) — это громадное хранилище пакетов которые вы можете использовать в собственных Python программах. Посетите Django Packages и вы также увидите много приложений для Django, который были добавлены другими разработчиками. По-существу Django сам является обычным Python пакетом. Всё это означает простую истину: вы можете брать любые существующие решения(пакеты, не важно Python или Django) и использовать в своих проектах как угодно. Это даёт большое преимущество в скорости. Не надо придумывать то, что уже придумано другими, а значит можно посвятить всё время только разработке уникальной стороны своего проекта.
Скажем вы начали новый проект в котором используется приложение для голосования, подобно тому, которое мы разрабатывали в предыдущих уроках. Как же сделать наше приложение с голосованием многократно используемым и независимым от проекта к проекту? К счастью, мы уже на правильном пути и затрагивали эту тему в 3 части. Тогда мы уже смогли отделить приложение для голосования от проекта при помощи URLconf, используя include. В этом уроке мы продвинемся вперёд в решении этого вопроса. А именно, оформим приложение таким образом, чтобы его можно было легко подключать в наших новых проектах. А при желании приложение можно будет опубликовать, и тогда его смогут использовать и другие.
Пакет? Приложение?
Пакет в Python (Package) представляет собой каталог в котором размещается обязательно файл __init__.py и один или несколько “модулей”. А “модуль” — это обычный файл с расширением ‘.py’ в котором размещён код на языке Python.
Пакет может быть импортирован в ваш код так import foo.bar или так from foo import bar. Для того, чтобы обычная директория (к примеру polls) превратилась в пакет, обязательно создайте в этой директории файл __init__.py. Этот файл может быть пустым.
Приложение (App) в Django является тоже пакетом Python. Только этот пакет адаптирован для использования с Django. Правила Django допускают включение в пакет таких модулей, как models, tests, urls и views.
Позднее мы будем использовать термин packaging для описания процесса создания пакетов для Python.
Ваш проект и ваши приложения
Если вы следовали нашим инструкциям из предыдущих частей урока, ваш каталог проекта должен иметь следующий вид:
mysite/ manage.py mysite/ __init__.py settings.py urls.py wsgi.py polls/ __init__.py admin.py migrations/ __init__.py 0001_initial.py models.py static/ polls/ images/ background.gif style.css templates/ polls/ detail.html index.html results.html tests.py urls.py views.py templates/ admin/ base_site.html
Во 2 части урока вы создали mysite/templates. А в 3 части урока вы создали polls/templates. Сейчас вы поймёте почему мы решили создать отдельный каталог для проекта и отдельный каталог для приложения. Всё, что касается нашего приложения для голосования мы сохранили в каталоге polls таким образом, чтобы он был автономным. Вот теперь, при желании, этот каталог можно скопировать в наш новый проект. Кроме этого, не забудьте сделать две вещи в новом проекте: добавить название приложения в кортеж INSTALLED_APPS который находится в settings.py, а после этого выполнить в консоли команду ./manage.py syncdb
И хоть приложение сейчас можно переносить из проекта в проект, этого не хватает для того, чтобы делиться с другими. Требуется оформить наше приложение особым образом и запаковать его.
Необходимые условия
Текущее состояние пакетов в Python немного запутано, содержит различные инструменты. В этом учебнике мы будем использовать setuptools для создания пакета. Это рекомендуемый инструмент для работы с пакетами (смерженый с форком distribute). Для его установки необходим pip. Установите эти два пакета. Доп. информацию можно получить по как установить Django используя pip. Вы можете установить setuptools аналогичным способом.
Создание пакета с вашим приложением
Пакеты Python созданы для удобного распространения и установки ваших приложений. Django использует аналогичную систему. Для простых приложений, как голосование, это не сложно.
Первым делом создайте родительский каталог для polls вне вашего Django проекта. Назовите его django-polls.
Выбор название для вашего приложения
Выбирая название для вашего пакета, проверьте на PyPI нет ли уже пакета с таким названием. Рекомендуем добавлять префикс django- к названию пакета. Это поможет людям при поиске приложений для Django.
Метка приложения (последняя часть пути к пакету приложения) должна быть уникальной в INSTALLED_APPS. Не используйте метки приложений Django из contrib packages, например, auth, admin или messages.
Перенесите каталог polls в django-polls.
Создайте файл django-polls/README.rst со следующим содержимым:
django-polls/README.rst
===== Polls ===== Polls is a simple Django app to conduct Web-based polls. For each question, visitors can choose between a fixed number of answers. Detailed documentation is in the "docs" directory. Quick start ----------- 1. Add "polls" to your INSTALLED_APPS setting like this:: INSTALLED_APPS = ( ... 'polls', ) 2. Include the polls URLconf in your project urls.py like this:: url(r'^polls/', include('polls.urls')), 3. Run `python manage.py migrate` to create the polls models. 4. Start the development server and visit http://127.0.0.1:8000/admin/ to create a poll (you'll need the Admin app enabled). 5. Visit http://127.0.0.1:8000/polls/ to participate in the poll.
Создайте файл django-polls/LICENSE. Выбор лицензии не будет рассматриваться в этом разделе, но помните, что пакет без лицензии бесполезен для сообщества. Django и большое количество Django-приложений распространяются под BSD лицензией, но вы можете выбрать любую другую лицензию.
Теперь создадим файл setup.py, который укажет процесс установки нашего приложения. Мы не будем описывать в деталях его содержимое, их вы можете найти в документации setuptools. Создайте django-polls/setup.py со следующим содержимым:
django-polls/setup.py
import os from setuptools import setup with open(os.path.join(os.path.dirname(__file__), 'README.rst')) as readme: README = readme.read() # allow setup.py to be run from any path os.chdir(os.path.normpath(os.path.join(os.path.abspath(__file__), os.pardir))) setup( name='django-polls', version='0.1', packages=['polls'], include_package_data=True, license='BSD License', # example license description='A simple Django app to conduct Web-based polls.', long_description=README, url='http://www.example.com/', author='Your Name', author_email='[email protected]', classifiers=[ 'Environment :: Web Environment', 'Framework :: Django', 'Intended Audience :: Developers', 'License :: OSI Approved :: BSD License', # example license 'Operating System :: OS Independent', 'Programming Language :: Python', # Replace these appropriately if you are stuck on Python 2. 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.2', 'Programming Language :: Python :: 3.3', 'Topic :: Internet :: WWW/HTTP', 'Topic :: Internet :: WWW/HTTP :: Dynamic Content', ], )
Только модули и пакеты Python добавляются в пакет по умолчанию. Чтобы добавить другие файлы, необходимо создать файл MANIFEST.in. Документация setuptools содержит подробное описание этого файла. Чтобы указать добавление README.rst и LICENSE файлов, создайте django-polls/MANIFEST.in со следующим содержимым:
django-polls/MANIFEST.in
include LICENSE include README.rst recursive-include polls/static * recursive-include polls/templates *
Не обязательно, но мы рекомендуем, добавлять документацию приложения. Создайте пустой каталог django-polls/docs для будущей документации. Добавьте еще одну строку в django-polls/MANIFEST.in:
Обратите внимание, каталог docs не будет включен в пакет, пока вы не добавите в него хотя бы один файл. Многие приложения Django также предоставляют документацию онлайн через такие сайты, как readthedocs.org.
Теперь попробуйте собрать ваш пакет выполнив python setup.py sdist (запустите в каталоге django-polls). Эта команда создаст каталог dist и соберет ваш новый пакет, django-polls-0.1.tar.gz.
Подробности о пакетах можно найти в The Hitchhiker’s Guide to Packaging.
Использование ваших пакетов
Т.к. каталог polls был перенесен с каталога проекта, он перестал работать. Исправим это установив пакет django-polls.
Устанавливаем как библиотеку пользователя
Инструкция описывает как установить django-polls как библиотеку пользователя. Это лучше, чем устанавливать как системный пакет, таким образом он не влияет на системные сервисы и других пользователей, и позволяет установить пакеты без прав администратора.
Но такая установка влияет на системные приложения запущенные этим пользователем, virtualenv более надежный инструмент (смотрите ниже).
Для установки пакета используйте pip (вы уже установили его, правда?):
pip install --user django-polls/dist/django-polls-0.1.tar.gz
Теперь ваш Django проект должен работать. Запустите сервер для проверки.
Для удаления пакета используйте pip:
pip uninstall django-polls
Распространение вашего пакета
Теперь, когда мы создали пакет и проверили его работоспособность, можно поделиться ним с сообществом Django! Если бы это был не просто пример, вы бы могли:
Отправить пакет друзьям электронной почтой.
Загрузить пакет на ваш сайт.
Отправить пакет в публичный репозиторий, такой как The Python Package Index (PyPI).
Подробности о PyPI смотрите на в разделе Quickstart The Hitchhiker’s Guide to Packaging.
Установка пакетов Python с использованием virtualenv
Раньше мы устанавливали пакет как библиотеку пользователя. В этом есть некоторые недостатки:
Изменение таких библиотек влияет на другие программы написанные на Python.
Вы не сможете использовать разные версии пакета (или пакеты с одинаковым названием).
Обычно такое происходит при работе над несколькими Django проекте. В таком случае лучше всего использовать virtualenv. Этот инструмент позволяет использовать независимые Python окружения, каждое со своими пакетами.
djbook.ru
Знакомство с Django — Документация Django 1.9
Поскольку Django был разработан в бурлящей среде новостного агентства, он призван сделать веб-разработку простой и быстрой. Далее представлен вводный обзор того, как можно писать веб-приложения при помощи Django.
Цель данного документа: предоставить вам достаточное количество технической информации для понимания основ работы Django, но следует иметь ввиду, что этот обзор не является учебником или справочником – хотя у нас всё это есть! Когда вы будете готовы к созданию своего первого проекта, вы можете начать с учебного руководства или окунуться в море подробнейшей информации.
Проектирование модели
Хотя вы вполне можете обойтись без использования базы данных, Django предоставляет object-relational mapper для описания формата БД в виде кода на языке Python.
Синтаксис моделей данных предлагает множество различных способов представления ваших данных, что помогает решать стандартные задачи по использованию БД. Вот небольшой пример:
mysite/news/models.py
from django.db import models class Reporter(models.Model): full_name = models.CharField(max_length=70) def __str__(self): # __unicode__ on Python 2 return self.full_name class Article(models.Model): pub_date = models.DateField() headline = models.CharField(max_length=200) content = models.TextField() reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE) def __str__(self): # __unicode__ on Python 2 return self.headline
Наслаждайтесь свободным API
Дело в том, что вам доступен развитый и бесплатный Python API для доступа к вашим данным. API создаётся на лету, без предварительной генерации кода:
# Import the models we created from our "news" app >>> from news.models import Reporter, Article # No reporters are in the system yet. >>> Reporter.objects.all() [] # Create a new Reporter. >>> r = Reporter(full_name='John Smith') # Save the object into the database. You have to call save() explicitly. >>> r.save() # Now it has an ID. >>> r.id 1 # Now the new reporter is in the database. >>> Reporter.objects.all() [<Reporter: John Smith>] # Fields are represented as attributes on the Python object. >>> r.full_name 'John Smith' # Django provides a rich database lookup API. >>> Reporter.objects.get(id=1) <Reporter: John Smith> >>> Reporter.objects.get(full_name__startswith='John') <Reporter: John Smith> >>> Reporter.objects.get(full_name__contains='mith') <Reporter: John Smith> >>> Reporter.objects.get(id=2) Traceback (most recent call last): ... DoesNotExist: Reporter matching query does not exist. # Create an article. >>> from datetime import date >>> a = Article(pub_date=date.today(), headline='Django is cool', ... content='Yeah.', reporter=r) >>> a.save() # Now the article is in the database. >>> Article.objects.all() [<Article: Django is cool>] # Article objects get API access to related Reporter objects. >>> r = a.reporter >>> r.full_name 'John Smith' # And vice versa: Reporter objects get API access to Article objects. >>> r.article_set.all() [<Article: Django is cool>] # The API follows relationships as far as you need, performing efficient # JOINs for you behind the scenes. # This finds all articles by a reporter whose name starts with "John". >>> Article.objects.filter(reporter__full_name__startswith='John') [<Article: Django is cool>] # Change an object by altering its attributes and calling save(). >>> r.full_name = 'Billy Goat' >>> r.save() # Delete an object with delete(). >>> r.delete()
Динамический административный интерфейс: это не просто строительный материал – это готовый дом
Как только вы определите свои модели, Django может автоматически создать удобный интерфейс администратора, позволяющий авторизованным пользователям добавлять, удалять и изменять объекты. Для этого следует зарегистрировать свою модель:
mysite/news/models.py
from django.db import models class Article(models.Model): pub_date = models.DateField() headline = models.CharField(max_length=200) content = models.TextField() reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)
mysite/news/admin.py
from django.contrib import admin from . import models admin.site.register(models.Article)
Задумка заключается в том, что редактировать разделы могут служащие или клиенты, или, может быть, только вы – и при этом вам не хотелось бы иметь дело с созданием бэкенд интерфейсов (backend interfaces) только лишь для управления контентом.
Обычным рабочим моментом при создании сайта на Django, является написание моделей и получение прав администратора для того, чтобы как можно скорее приступить к работе. Так ваши сотрудники (или клиенты) могут сразу же начать наполнение сайта данными, а вы параллельно продолжите подготавливать сайт для публикации.
Проектирование схемы URL
Красивая, элегантная схема URL является важной составляющей высококачественного веб-приложения. Django поощряет создание красивых схем URL и не захламляет их мусором, подобным .php
или же .asp.
Проектируя модель URL для своего приложения, вы создаёте модуль Python, называемый менеджером URL-ов. Оглавление вашего приложения представляет из себя простое соответствие между URL-адресом и вызываемой функцией на Python. URLconfs служит для выделения URL адресов из кода на Python.
Вот таким образом может выглядеть схема URL для классов Reporter
/Article
, представленных выше:
mysite/news/urls.py
from django.conf.urls import url from . import views urlpatterns = [ url(r'^articles/([0-9]{4})/$', views.year_archive), url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive), url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail), ]
Указанная схема URL содержит простые регулярные выражения для вызова соответствующей функции Python (соответствующего представления, “views”). Регулярные выражения используют скобки для “захвата” значения из URL-адреса. Когда пользователь запрашивает страницу, Django проходит по всем шаблонам по порядку и останавливается на первом подходящем (если ни один из шаблонов не подошёл, Django вызовет исключение 404.) Это происходит мгновенно, поскольку регулярные выражения компилируются ещё во время загрузки.
После того, как соответствующий шаблон найден, Django импортирует и вызывает представление, которое является по сути простой функцией на Python. Каждое представление передаёт объект запроса – он содержит возвращаемые метаданные – и значения, захваченные регулярным выражением.
К примеру, если пользователь запросил URL “/articles/2005/05/39323/”, Django должен вернуть функцию news.views.article_detail(request, '2005', '05', '39323')
.
Написание представлений
Каждое представление отвечает за выполнение одной из двух вещей: возвращение объекта HttpResponse
, представляющего содержимое запрашиваемой страницы, или вызов исключения такого как Http404
. Остальное зависит от вас.
Как правило, представление извлекает данные в соответствии с заданными параметрами, загружает шаблон и отображает этот шаблон вместе с полученными данными. Это пример представления year_archive
, представленного выше:
mysite/news/views.py
from django.shortcuts import render from .models import Article def year_archive(request, year): a_list = Article.objects.filter(pub_date__year=year) context = {'year': year, 'article_list': a_list} return render(request, 'news/year_archive.html', context)
В примере используется язык шаблонов Django, который имеет несколько сильных особенностей, но вместе с тем остаётся простым в использовании даже для не-программистов.
Проектирование шаблонов
Код, представленный выше, возвращает шаблон news/year_archive.html
.
Django включает пути поиска по шаблонам, что позволяет свести к минимуму избыточность html-кода. В настройках Django нужно указать список каталогов, откуда Django сможет загружать шаблоны. Это делается с помощью настройки DIRS
. Если шаблон не будет найден в первом каталоге, Django проверит второй и все последующие.
Скажем, шаблон news/year_archive.html
был найден. Вот как он может выглядеть:
mysite/news/templates/news/year_archive.html
{% extends "base.html" %} {% block title %}Articles for {{ year }}{% endblock %} {% block content %} <h2>Articles for {{ year }}</h2> {% for article in article_list %} <p>{{ article.headline }}</p> <p>By {{ article.reporter.full_name }}</p> <p>Published {{ article.pub_date|date:"F j, Y" }}</p> {% endfor %} {% endblock %}
Переменные всегда окружены двумя фигурными скобками. {{ article.headline }}
означает “вывести переменную, хранящую заголовок статьи.” Хотя точка используется не только для доступа к атрибутам: с её помощью можно провести поиск в словаре, поиск индекса и вызов функции.
Примечательно, что {{ article.pub_date|date:"F j, Y" }}
использует Unix-стиль “pipe” (символ вертикальной черты “|”). Это называется шаблонным фильтром и это хороший способ для фильтрации значений переменной. В примере фильтр даты приводит объект datetime к нужному виду (как нахождение функции даты в PHP).
Вы можете последовательно применить столько фильтров, сколько вам будет нужно. Вы можете писать собственные шаблонные фильтры. Вы можете писать собственные шаблонные теги, которые будут неявно выполнять ваш код.
Наконец, Django использует концепцию “наследования шаблонов”: это достигается путём включения базового шаблона {% extends "base.html" %}
. И это значит, что первым будет загружен шаблон ‘base’, в котором определено множество различных блоков, которые в свою очередь также могут содержать в себе какие-то блоки. Короче говоря, это позволяет намного сократить количество html-шаблонов страниц: каждый новый шаблон должен включать уникальные элементы, присущие только ему.
Базовый шаблон “base.html”, включающий использование статических файлов, может выглядеть следующим образом:
mysite/templates/base.html
{% load staticfiles %} <html> <head> <title>{% block title %}{% endblock %}</title> </head> <body> <img src="{% static "images/sitelogo.png" %}" alt="Logo" /> {% block content %}{% endblock %} </body> </html>
Проще говоря, он определяет внешний вид сайта (подгружает логотип), а также оставляет место для заполнения блоков в дочерних шаблонах. Это позволяет свести редизайн всего сайта к изменению единственного файла – базового шаблона.
Также этот подход позволит вам создавать несколько версий сайта, использующих различные базовые шаблоны, в то время как дочерние шаблоны останутся неизменными. Создатели Django использовали этот подход для написания отдельного шаблона для мобильных устройств – просто создав новый базовый шаблон.
Обратите внимание на то, что вы можете не использовать язык шаблонов Django, если отдаёте предпочтение какому-то иному. Хотя язык шаблонов Django как нельзя лучше подходит при создании моделей Django, никто не заставляет вас использовать его. Если уж на то пошло, знайте, что вы даже вправе не пользоваться API баз данных Django. Вы можете использовать другой уровень абстракции базы данных, вы можете читать XML-файлы, вы можете читать файлы с диска, да и вообще делать всё, что угодно. Каждая часть Django – модели, представления, шаблоны – отделены друг от друга.
Это просто вершина айсберга
Это был только краткий обзор возможностей Django. Вот ещё несколько полезных особенностей, о которых следовало бы знать:
Система кэширования, интегрированная с memcached или другими бэкэндами кэширования.
Фреймворк syndication, позволяющий сделать создание RSS и Atom фидов таким же простым делом, как написание небольшого класса на Python.
Более изящный, генерируемый автоматически, административный интерфейс – этот обзор лишь едва коснулся его описания.
Следующими вашими шагами будут установка Django, чтение руководства и присоединение к англоязычному или к русскоязычному сообществам. Благодарим вас за проявленный интерес!
djbook.ru