Django_-_podrobnoe_rukovodstvo
.pdf
520 |
Приложение F. Утилита django-admin |
runserver
Запускает на локальном компьютере простой веб-сервер разработки. По умолчанию сервер прослушивает порт 8000 на IP-адресе 127.0.0.1, но можно явно указать адрес и номер порта.
При выполнении этой команды от имени пользователя с обычными привилегиями (рекомендуется) вы не сможете запустить сервер с номером порта меньше 1024. Такие порты доступны только суперпользователю (root).
Не используйте этот сервер для запуска действующего сайта. Он не подвергался аудиту безопасности и тестированию производительности. (И так оно и останется в будущем. Мы занимаемся разработкой вебфреймворков, а не веб-серверов, поэтому улучшение сервера до такой степени, чтобы он мог эксплуатироваться в производственном режиме, не входит в задачу проекта Django.)
Сервер разработки автоматически перезагружает Python-код при каждом запросе, если это необходимо. Поэтому не нужно вручную перезапускать сервер, чтобы изменения вступили в силу.
В момент запуска, а также при каждом изменении Python-кода, сервер проверяет все установленные модели (см. описание подкоманды validate ниже). Информация обо всех найденных ошибках выводится на стандартный вывод, но сервер при этом не останавливается.
Можно запускать несколько серверов, прослушивающих разные порты. Для этого достаточно выполнить команду django-admin.py runserver несколько раз.
Отметим, что используемый по умолчанию IP-адрес 127.0.0.1 недоступен для других компьютеров в сети. Чтобы его видели другие машины, следует указать сетевой адрес сервера (например, 192.168.2.1) или 0.0.0.0 (если вы не знаете своего адреса в сети)1.
Параметр --adminmedia сообщает Django, где искать CSS- и JavaScriptфайлы, необходимые административному интерфейсу. Обычно сервер разработки автоматически берет эти файлы из дерева исходных текстов Django, но если вы как-то модифицировали их для собственного сайта, то нужно указать местоположение.
Пример:
django-admin.py runserver --adminmedia=/tmp/new-admin-style/
Параметр --noreload отключает автоматическую перезагрузку. Это означает, что изменения, внесенные в Python-код при запущенном сервере, не вступят в силу, если модифицированный модуль уже загружен в память.
1В этом случае Django автоматически определит IP-адрес из сетевых настроек компьютера и будет использовать его. – Прим. науч. ред.
522 |
Приложение F. Утилита django-admin |
манда ищет файл <appname>/sql/<modelname>.sql, где <appname> – имя приложения, а <modelname> – имя модели, записанное строчными буквами. Например, если в приложении news имеется модель Story, то sqlcustom попытается прочитать файл news/sql/story.sql.
Предполагается, что все такие файлы содержат корректные SQLкоманды. Эти команды передаются СУБД после создания всех таблиц. Этим приемом можно пользоваться, чтобы внести в базу данных некоторые модификации или добавить SQL-функции.
Отметим, что порядок обработки SQL-файлов не определен.
sqlflush
Выводит SQL-команды, которые были бы выполнены подкомандой flush.
sqlindexes <appname appname ...>
Выводит SQL-команды CREATE INDEX для указанных приложений.
sqlreset <appname appname ...>
Выводит сначала SQL-команды DROP TABLE, а потом CREATE TABLE для указанных приложений.
sqlsequencereset <appname appname ...>
Выводит SQL-команды восстановления последовательностей для указанных приложений.
startapp <appname>
Создает в текущем каталоге структуру подкаталогов для приложения Django с указанным именем.
startproject <projectname>
Создает в текущем каталоге структуру подкаталогов для проекта Django с указанным именем. Эта подкоманда отключается, если в команде django-admin.py указан флаг --settings или установлена переменная окружения DJANGO_SETTINGS_MODULE. Чтобы активировать ее, нужно либо убрать флаг --settings, либо удалить переменную DJANGO_SETTINGS_ MODULE.
syncdb
Создает таблицы базы данных для приложений, перечисленных в параметре INSTALLED_APPS, для которых таблицы еще не созданы. Выполняйте эту команду после добавления в проект новых приложений, которые создают какие-то таблицы в базе. По умолчанию это относится и к стан-
Дополнительные удобства |
525 |
•• 0 – ничего не выводить.
•• 1 – вывод в обычном объеме (по умолчанию).
•• 2 – подробный вывод. Пример:
django-admin.py syncdb --verbosity 2
Дополнительные удобства
Подсветка синтаксиса
Подкоманды django-admin.py и manage.py, которые выводят на стандартный вывод SQL-команды, используют цветовую подсветку синтаксиса, если терминал поддерживает ANSI-цвета. При выводе команд в конвейер цветовое кодирование отключается.
Автоматическое завершение для Bash
Если вы пользуетесь оболочкой Bash, то советуем установить сценарий автоматического завершения команд, который находится в каталоге extras/django_bash_completion дистрибутива Django. Он активирует режим автоматического завершения в командах django-admin.py и manage. py, то есть можно, например:
•• Ввести django-admin.py.
•• Нажать клавишу Tab, чтобы увидеть все возможные варианты продолжения.
•• Ввести sql, затем нажать Tab и увидеть все подкоманды, начинающиеся с sql.
G
Объекты запроса и ответа
Для передачи информации о состоянии между различными компонентами системы в Django используются объекты запроса и ответа. При запросе страницы Django создает объект HttpRequest, содержащий метаданные о запросе. Затем Django загружает подходящее представление, передавая ему объект HttpRequest в качестве первого аргумента. Представление обязано вернуть объект HttpResponse.
Эти объекты встречались нам на протяжении всей книги, а сейчас мы опишем их API полностью.
Класс HttpRequest
Класс HttpRequest представляет HTTP-запрос, полученный со стороны клиента. Большая часть информации о запросе доступна через атрибуты объекта этого класса (табл. G.1). Все атрибуты, кроме session, следует считать доступными только для чтения.
Таблица G.1. Атрибуты объектов HttpRequest
Атрибут |
Описание |
|
|
path |
Строка, представляющая полный путь к запрашиваемой |
|
странице, не включающий домен, например, “/music/bands/ |
|
the_beatles/”. |
method |
Строка, представляющая HTTP-метод, которым отправлен за- |
|
прос. Всегда записывается заглавными буквами. Например: |
|
if request.method == ‘GET’: |
|
do_something() |
|
elif request.method == ‘POST’: |
|
do_something_else() |
|
|
Класс HttpRequest |
527 |
||
|
Атрибут |
|
Описание |
|
|
||
|
|
|
|
|
encoding |
|
Строка, представляющая кодировку данных формы (или None, |
|
|
|
если используется кодировка DEFAULT_CHARSET). |
|
|
|
Значение этого атрибута можно переопределить, чтобы изме- |
|
|
|
нить предполагаемую кодировку данных формы. При последу- |
|
|
|
ющем обращении к атрибуту (например, при чтении данных из |
|
|
|
GETили POST-запроса) будет использоваться новое значение. |
|
|
|
Полезно, если вы точно знаете, что данные формы представле- |
|
|
|
ны не в кодировке DEFAULT_CHARSET. |
|
GET |
|
Подобный словарю объект, содержащий все GET-параметры. |
|
|
|
См. раздел «Объекты QueryDict» ниже. |
|
POST |
|
Подобный словарю объект, содержащий все POST-параметры. |
|
|
|
См. раздел «Объекты QueryDict» ниже. |
|
|
|
Может случиться так, что для запроса, отправленного методом |
|
|
|
POST, словарь POST окажется пустым, – если, например, форма |
|
|
|
не содержит никаких данных. Поэтому нельзя использовать |
|
|
|
инструкцию if request.POST, чтобы убедиться, что запрос от- |
|
|
|
правлен методом POST; для этого следует использовать ин- |
|
|
|
струкцию if request.method == “POST” (см. описание атрибута |
|
|
|
method выше). |
|
|
|
Примечание: объект POST не содержит информацию о загружен- |
|
|
|
ных файлах. См. атрибут FILES. |
|
REQUEST |
|
Подобный словарю объект, предназначенный для удобства: |
|
|
|
сначала ищет параметр в POST, а потом в GET. |
|
|
|
Смоделирован по образцу переменной $_REQUEST в PHP. |
|
|
|
Например, если GET = {“name”: “john”} и POST = {“age”: ‘34’}, то |
|
|
|
REQUEST[“name”] будет содержать “john”, а REQUEST[“age”] – “34”. |
|
|
|
Настоятельно рекомендуем выражать свои намерения явно |
|
|
|
и пользоваться объектами GET и POST, а не REQUEST. |
|
COOKIES |
|
Стандартный словарь Python, содержащий все cookie. Ключи |
|
|
|
и значения словаря представлены строками. |
|
|
|
Подробнее о cookie см. главу 14. |
|
FILES |
|
Подобный словарю объект, который отображает имена файлов |
|
|
|
в объекты UploadedFile. Дополнительные сведения см. в доку- |
|
|
|
ментации по Django. |
|
META |
|
Стандартный словарь Python, содержащий все HTTP-заголов |
|
|
|
ки. Состав заголовков зависит от клиента и от сервера. Вот не- |
|
|
|
сколько примеров: |
|
|
|
• CONTENT_LENGTH |
|
|
|
• CONTENT_TYPE |
|
|
|
• QUERY_STRING: строка запроса в исходном виде |
|
|
|
|
Класс HttpRequest |
529 |
Таблица G.2. Методы HttpRequest
Метод |
Описание |
|
|
__getitem__(key) |
Возвращает значение GETили POST-параметра с име- |
|
нем, соответствующим ключу. Сначала проверяется |
|
объект POST, а затем GET. Если ключ отсутствует, возбуж- |
|
дается исключение KeyError. |
|
Это дает возможность обращаться к объекту HttpRequest |
|
как к словарю. Например, request[“foo”] – то же са- |
|
мое, что сначала проверить request.POST[“foo”], а потом |
|
request.GET[“foo”]. |
has_key() |
Возвращает True, если в request.GET или в request.POST |
|
присутствует указанный ключ, и False в противном слу- |
|
чае. |
get_host() |
Возвращает доменное имя сервера, которому адресован |
|
запрос, получая его из заголовка HTTP_X_FORWARDED_HOST |
|
или HTTP_HOST (в таком порядке). Если оба заголовка |
|
отсутствуют, то имя сервера образуется из SERVER_NAME |
|
и SERVER_PORT. |
get_full_path() |
Возвращает путь, к которому добавлена строка запроса, |
|
если она присутствует в URL. Например, “/music/bands/ |
|
the_beatles/?print=true”. |
is_secure() |
Возвращает True, если запрос был отправлен по протоко- |
|
лу HTTPS. |
|
|
Объекты QueryDict
Атрибуты GET и POST объекта HttpRequest являются экземплярами класса django.http.QueryDict. Этот класс похож на словарь, но позволяет хранить несколько значений для одного ключа. Необходимость в этом возникает потому, что для некоторых элементов HTML-форм и, прежде всего, для <select multiple=”multiple”>, с одним ключом может быть ассоциировано несколько значений.
Объекты QueryDict неизменяемы, разве что вы скопируете их методом copy(). Это означает, что напрямую изменить атрибуты request.POST
иrequest.GET невозможно.
Вклассе QueryDict реализованы все стандартные методы словаря, потому что он является подклассом последнего. Отличия перечислены в табл. G.3.
