django — вопросы с ответами

Предназначение и область работы

Django был разработан с нуля для решения двух общих задач веб-разработчиков: сжатые сроки и строгое соблюдение принципа Don’t repeat yourself, DRY (метод снижения количества повторений информации разного рода). Суть DRY все еще не изменилась: зачем писать один и тот же код снова и снова?

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

Но быстрый не значит небрежный. Django поставляется с удобным встроенным разделом для администрирования сайтов. Раздел администратора поддерживает различные варианты кэширования (включая Memcached) и множество других стабильных, масштабируемых инструментов.

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

Структура

Django был разработан для того, чтобы сделать веб-разработку быстрой и простой – скажем даже весело. И под быстрой имеется в виду именно быстрой. Как только вы освоитесь с Django, вам не составит труда перейти от простого макета к работающему демонстрационному сайту за час или около того.

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

Тем не менее, веб-сервер, включенный в Django, не предназначен для использования в производственной среде. Предпочтительным методом является запуск Django через mod_python или mod_wsgi. Но для начала давайте посмотрим, как вы можете создать приложение в Django.

Как оказалось, создание приложения в Django на самом деле занимает гораздо меньше времени, чем объяснение того, как его создать.

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

Пример начального этапа создания приложения

Сначала создайте проект с помощью встроенного инструмента командной строки (python django-admin.py startproject projectname). Это создаст новую папку, содержащую файл базовых настроек проекта, который вы можете использовать для указания соединений с базой данных, расположения шаблонов и многого другого. Также в папке находится urls.py, который определяет ваши базовые URL-адреса и manage.py, который содержит стандартный набор инструментов командной строки.

Затем создайте приложение, используя встроенный инструмент командной строки python manage.py startapp appname.

Как только папка приложения будет на месте, загляните внутрь. Вы увидите три файла: models.py, urls.py и views.py. Это файлы, которые вы будете использовать для создания приложения:

  • models.py для разработки вашей модели;
  • urls.py, чтобы записать ваши URL;
  • views.py для создания ваших представлений.

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

Следует также помнить, что Django написан на Python и требует Python 2.3 или выше. Mac OS X и большинство дистрибутивов Linux поставляются с Python 2.5, поэтому у вас не должно возникнуть с ним никаких проблем. Однако пользователям Windows, возможно, придется установить Python отдельно.

Принцип работы

Самый простой способ разобраться в механике Django – это разбить его на составные части. Прежде всего, есть файл models.py, который определяет вашу модель данных путем экстраполяции отдельных строк кода в полные таблицы базы данных и добавления предварительно созданного (совершенно необязательного) раздела администрирования для управления контентом.

Следующий элемент – это файл urls.py, который использует регулярные выражения для захвата шаблонов URL для обработки.

Фактическая обработка происходит в ваших представлениях, которые, если вы еще не видели шаблон, живут в views.py. Это на самом деле основа всего Django, так как в представлениях вы получаете данные, которые вы представляете посетителю.

Вот что происходит, когда посетитель попадает на вашу Django-страницу:

  1. Сначала Django просматривает различные шаблоны URL, которые вы создали, и использует эту информацию для получения представления.
  2. Затем представление обрабатывает запрос, запрашивая базу данных, если это необходимо.
  3. Представление передает запрашиваемую информацию в ваш шаблон.
  4. Затем шаблон отображает данные в макете, который вы создали, и отображает страницу.

Внутренняя система проекта

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

Основополагающим элементом веб-приложения Django является проект Django. Проект Django состоит из одного или нескольких приложений Django как показано на рисунке:

Приложение Django – это автономный пакет, который должен делать только одну вещь. Например, блог, приложение членства или календарь событий. Как видно, внизу рисунка есть дополнительный пакет под названием Django Apps.

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

Хотя встроенные приложения невидимы в дереве проекта, вы можете увидеть их в файле settings.py:

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

Вы можете ясно увидеть эту логику просто открыв уже ранее созданные проекты. Откройте папку myclub_project. Структура папок должна выглядеть примерно так:

Давайте рассмотрим эти файлы и папки более подробно:

  • В папке env_myclub хранятся файлы для вашей виртуальной среды. Здесь есть много интересных полезностей для продвинутых пользователей, но для начинающих лучше всего оставить все в этой папке в покое;
  • Внешняя папка myclub_site – это ваш проект Django. Django создает эту папку и ее содержимое, когда вы запускаете команду startproject. Фреймворк не заботится об имени папки, поэтому вы можете переименовать ее во что-то более значимое для вас;
  • Внутри внешней папки myclub_site находятся два файла: db.sqlite3 и manage.py. Первый является базой данный, которая создается при запуске команды migrate. А второй – это утилита командной строки для выполнения команд Django из вашего проекта;
  • Внутренняя папка myclub_site – это ваше веб-приложение на Django. Это единственное приложение, которое Django создает для вас автоматически. Поскольку Django – это веб-фреймворк, он предполагает, что вам понадобится приложение для веб-сайта.

Очень распространенная жалоба программистов, только начинающих работать с Django, касается того, насколько сложно запомнить, в какой папке они должны работать, когда обе они имеют одинаковые названия. Django не одинок в этой проблеме – интегрированные среды разработки (IDE), такие как Visual Studio, создают папку проекта и папку приложения с одинаковым именем. Но только потому, что это распространено, это не значит, что это не сбивает с толку.

Как было сказано чуть выше, Django не волнует, как вы назовете эту папку. Так что давайте продолжим и сотворим немыслимое, нарушив все советы и официальные гайды по обучении Django, переименуем папку!

В данном случае мы собираемся переименовать ее в "myclub_root".

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

Ну а после уже так:

Теперь никакой путаницы возникнуть не должно, так что давайте заглянем в веб-приложение myclub_site, созданное для нас Django:

  • Файл __init__.py сообщает Python, что эта папка (ваше приложение Django) является пакетом Python;
  • settings.py содержит настройки для вашего проекта Django. Каждый проект Django должен иметь файл настроек. По соглашению, Django помещает его в приложение на вашем веб-сайте, но ему не обязательно там жить. Есть сторонники других и структур, но здесь мы будем придерживаться значения по умолчанию;
  • urls.py хранит конфигурации URL уровня проекта. По умолчанию он содержит один шаблон URL для администратора. О URL-адресах и этом файле мы расскажем подробнее чуть позже;
  • wsgi.py позволяет WSGI-совместимым веб-серверам обслуживать ваш проект.

Дополнительное использование urls.py

Для облегчения работы со своим проектом следует воспользоваться очень удобным подходом – определить все URL-адреса вашего приложения в файле, который находится внутри самого приложения. В этом случае мы будем использовать файл внутри приложения блога, который также будет называться urls.py.

Однако, прежде чем мы начнем с этого файла, нам нужно рассказать об этом Django. Поэтому добавьте эту строку в файл urls.py для всего проекта (чуть ниже строки, которая определяет URL-адреса администратора), например:

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

10 ответов
Можно ли временно отключить ограничения в MySQL? У меня две модели Django, каждая из которых имеет ForeignKey для другой. Удаление экземпляров модели возвращает ошибку из-за ограничения ForeignKey: cursor.execute("DELETE FROM myapp_item WHERE n = %s", n) transaction.commit_unless_managed() #a forei...
19 март 2013, в 14:31
7 ответов
Я хотел бы знать, каковы все возможные значения для аргумента часового пояса в библиотеке Python Pytz. Как это сделать? РЕШЕНИЕ for tz in pytz.all_timezones: print tz Africa/Abidjan Africa/Accra Africa/Addis_Ababa Africa/Algiers Africa/Asmara Africa/Asmera Africa/Bamako Africa/Bangui Africa/...
pytz
13 дек. 2012, в 19:24
20 ответов
Я пытаюсь исправить один из моих виртуальных пользователей - я хотел бы, чтобы reset все установленные библиотеки возвращались к тем, которые соответствуют производству. Есть ли быстрый и простой способ сделать это с помощью pip?
28 июнь 2012, в 15:34
9 ответов
Когда мы добавляем поле базы данных в django, мы обычно пишем models.CharField(max_length=100, null=True, blank=True). То же самое делается с ForeignKey, DecimalField и т.д. Какова основная разница в том, что null=True только blank=True только null=True, blank=True относительно разных (CharField,...
django-models
22 дек. 2011, в 18:40
30 ответов
Я развертываю приложение Django для dev-сервера и нажимаю эту ошибку, когда я запускаю pip install requirements.txt: Traceback (most recent call last): File "/var/www/mydir/virtualenvs/dev/bin/pip", line 5, in <module> from pkg_resources import load_entry_point ImportError: No module nam...
pip
virtualenv
setuptools
16 сен. 2011, в 14:20
25 ответов
Мне нужно использовать Python и Django для нашего заявление. Поэтому у меня есть две версииPython, 2.6 и 2.7. Теперь я установилDjango. Я могу запустить образец приложения для тестированияDjango succesfuly. Но как я могу убедиться, чтоDjango использует версию 2.6 или 2.7 и какую версию модулей испол...
24 июнь 2011, в 12:53
10 ответов
Как новичок в Django, мне сложно создать приложение для загрузки в Django 1.3. Я не смог найти свежий пример/фрагменты. Может кто-нибудь отправить минимальный, но полный (модель, вид, шаблон) пример кода для этого?
file
upload
03 май 2011, в 15:49
22 ответа
Это очень обсуждаемая проблема для пользователей OSX 10.6, но я не смог найти решение, которое работает. Здесь моя настройка: Python 2.6.1 64bit Django 1.2.1 MySQL 5.1.47 osx10.6 64bit Я создаю virtualenvwrapper с --no-site-пакетами, а затем установлен Django. Когда я активирую virtualenv и запускаю...
virtualenv
virtualenvwrapper
01 июнь 2010, в 18:34
14 ответов
Я пытаюсь преобразовать ответ Ajax на стороне сервера script в Django HttpResponse, но, видимо, он не работает. Это серверная сторона script: /* RECEIVE VALUE */ $validateValue=$_POST['validateValue']; $validateId=$_POST['validateId']; $validateError=$_POST['validateError']; /* RETURN VALUE */ $arr...
11 март 2010, в 19:37
27 ответов
Итак, я начал изучать код Python и позже Django. В первый раз было трудно смотреть на трассировки и фактически выяснить, что я сделал не так, и где была синтаксическая ошибка. Некоторое время прошло и в пути, похоже, у меня есть рутина в отладке моего кода Django. Поскольку это было сделано в начале...
debugging
13 июль 2009, в 07:10
31 ответ
Я создаю веб-приложение с Django. Причины, по которым я выбрал Django, были следующими: Я хотел работать со свободными/открытыми инструментами. Мне нравится Python и чувствую, что это "долгосрочный" язык, тогда как в отношении Ruby я не был уверен, и PHP казался огромной проблемой для изучения. Я...
web-applications
scalability
20 май 2009, в 06:19
11 ответов
В Django-модели QuerySets я вижу, что для сравнительных значений есть __gt и __lt, но есть ли __ne/!=/<> ( не равно?) Я хочу отфильтровать с помощью не равно: Пример: Model: bool a; int x; Я хочу results = Model.objects.exclude(a=true, x!=5) != - неправильный синтаксис. Я пробовал _...
django-models
django-queryset
26 март 2009, в 20:17
22 ответа
Я работаю над веб-приложением, используя Django, и мне любопытно, есть ли способ запланировать выполнение задания периодически. В основном я просто хочу запускать базу данных и делать некоторые вычисления/обновления на регулярной основе, но я не могу найти никакой документации по этому поводу. Кто-н...
web-applications
scheduled-tasks
21 фев. 2009, в 18:02
12 ответов
Я пытаюсь построить поиск для сайта Django, который я строю, и в поиске я ищу в 3 разных моделях. И чтобы получить нумерацию страниц в списке результатов поиска, я хотел бы использовать общее представление object_list для отображения результатов. Но для этого мне нужно объединить 3 набора запросов ...
search
django-queryset
django-q
10 янв. 2009, в 19:49
8 ответов
Когда я читаю код Django, я часто вижу в моделях то, что называется "slug". Я не совсем уверен, что это такое, но я знаю, что он имеет какое-то отношение к URL-адресам. Как и когда эта пуля должна использоваться? (Я прочитал его определение в этот глоссарий.)...
django-models
slug
09 янв. 2009, в 04:40
Наверх
Меню