Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Django_-_podrobnoe_rukovodstvo

.pdf
Скачиваний:
373
Добавлен:
01.03.2016
Размер:
5 Мб
Скачать
☆

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-адрес из сетевых настроек компьютера и будет использовать его. – Прим. науч. ред.

Подкоманды

521

Пример:

django-admin.py runserver --noreload

Примеры использования различных портов и IP-адресов

Порт 8000 на IP-адресе 127.0.0.1:

django-admin.py runserver

Порт 8000 на IP-адресе 1.2.3.4:

django-admin.py runserver 1.2.3.4:8000

Порт 7000 на IP-адресе 127.0.0.1:

django-admin.py runserver 7000

Порт 7000 на IP-адресе 1.2.3.4:

django-admin.py runserver 1.2.3.4:7000

Обслуживание статических файлов сервером разработки

По умолчанию сервер разработки не обслуживает статические файлы сайта (CSS-файлы, изображения, файлы, адреса URL которых начинается с MEDIA_URL, и т. д.).

shell

Подкоманда shell запускает интерактивный интерпретатор Python.

Django использует программу IPython (http://ipython.scipy.org/), если она установлена. Если IPython установлена, но вы хотите работать с обычным интерпретатором Python, то укажите параметр --plain:

django-admin.py shell --plain

sql <appname appname ...>

Выводит все SQL-команды CREATE TABLE для указанных приложений.

sqlall <appname appname ...>

Выводит все SQL-команды CREATE TABLE и команды записи начальных данных для указанных приложений. О задании начальных данных см. описание подкоманды sqlcustom.

sqlclear <appname appname ...>

Выводит SQL-команды DROP TABLE для указанных приложений.

sqlcustom <appname appname ...>

Выводит пользовательские SQL-команды для указанных приложений. Для каждой модели в каждом из указанных приложений эта подко-

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, для которых таблицы еще не созданы. Выполняйте эту команду после добавления в проект новых приложений, которые создают какие-то таблицы в базе. По умолчанию это относится и к стан-

Подкоманды

523

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

Syncdb не изменяет существующие таблицы

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

Если вы внесли изменения в модель и хотите отразить их в схеме базы данных, то с помощью команды sql распечатайте новую схему, сравните ее с существующей и произведите корректировку самостоятельно.

При установке приложения django.contrib.auth подкоманда syncdb предлагает сразу же создать учетную запись суперпользователя.

syncdb также пытается отыскать фикстуру с именем initial_data и подходящим расширением (например, json или xml). О том, как составлять файлы фикстур, см. раздел, посвященный подкоманде loaddata, в официальной документации по Django.

Параметр --noinput

Чтобы команда не задавала никаких вопросов типа «Вы уверены?», укажите параметр noinput. Это полезно, когда django-admin.py запускается в составе автоматизированного сценария, без сопровождения.

test

Выполняет тесты для всех установленных моделей. Дополнительные сведения о тестировании см. в документации по Django.

Параметр --noinput

Чтобы команда не задавала никаких вопросов типа «Вы уверены?», укажите параметр -noinput. Это полезно, когда django-admin.py запускается в составе автоматизированного сценария, без сопровождения.

testserver <fixture fixture ...>

Запускает сервер разработки Django (как и runserver), используя тестовые данные из указанных фикстур. Дополнительные сведения см. в документации по Django.

524

Приложение F. Утилита django-admin

validate

Проверяет все установленные модели (перечисленные в параметре INSTALLED_APPS) и выводит на стандартный вывод сообщения об ошибках.

Параметры по умолчанию

У некоторых подкоманд имеются специальные параметры, но все они также принимают следующие стандартные параметры.

--pythonpath

Добавляет указанный путь в файловой системе­ в путь импорта Python. Если параметр не задан, то утилита django-admin.py будет использовать переменную окружения PYTHONPATH.

Пример:

django-admin.py syncdb --pythonpath=’/home/djangoprojects/myproject’

Отметим, что для сценария manage.py этот параметр необязателен, потому что он устанавливает путь Python автоматически.

--settings

Явно указывает, какой параметр следует использовать. Значение должно быть задано в синтаксисе, принятом для пакетов Python, например mysite.settings. Если параметр не задан, то django-admin.py будет использовать переменную окружения DJANGO_SETTINGS_MODULE.

Пример:

django-admin.py syncdb --settings=mysite.settings

Отметим, что для сценария manage.py этот параметр необязателен, потому что он по умолчанию берет файл settings.py из текущего проекта.

--traceback

По умолчанию django-admin.py выводит в случае ошибки только сообщение о ней. Если же задан параметр --traceback, то будет выведена полная трассировка исключения.

Пример:

django-admin.py syncdb --traceback

--verbosity

Определяет уровень детальности отладочной информации, выводимой на консоль.

Дополнительные удобства

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: строка запроса в исходном виде

 

 

 

 

528

Приложение G. Объекты запроса и ответа

Таблица G.1. (Продолжение)

Атрибут

Описание

 

 

 

• REMOTE_ADDR: IP-адрес клиента

 

• REMOTE_HOST: доменное имя клиента

 

• SERVER_NAME: доменное имя сервера

 

• SERVER_PORT: номер порта сервера

 

Каждый HTTP-заголовок представлен в словаре META ключом

 

с префиксом HTTP_, записанным заглавными буквами; дефисы

 

замещаются символами подчеркивания. Например:

 

• HTTP_ACCEPT_ENCODING

 

• HTTP_ACCEPT_LANGUAGE

 

• HTTP_HOST: заголовок Host, отправленный клиентом

 

• HTTP_REFERER: ссылающаяся страница, если имеется

 

• HTTP_USER_AGENT: строка, определяющая тип броузера

 

пользователя

 

• HTTP_X_BENDER: заголовок X-Bender, если имеется

user

Объект django.contrib.auth.models.User, представляющий теку-

 

щего аутентифицированного пользователя. Если пользователь

 

не аутентифицирован, то user – объект класса django.contrib.

 

auth.models.AnonymousUser. Отличить один от другого можно вы-

 

зовом метода is_authenticated():

 

if request.user.is_authenticated():

 

# пользователь аутентифицирован

 

else:

 

# анонимный пользователь

 

Атрибут user присутствует лишь в случае, если активирован

 

дополнительный процессор AuthenticationMiddleware.

 

Подробную информацию об аутентификации и пользователях

 

см. в главе 14.

session

Доступный для чтения и записи объект, подобный словарю, ко-

 

торый описывает текущий сеанс.

 

Присутствует лишь в случае, если активирована поддержка

 

сеансов. См. главу 14.

raw_post_

Неформатированные данные из POST-запроса. Полезно для не-

data

которых специальных видов обработки.

 

 

У объектов запроса есть также несколько полезных методов, перечисленных в табл. G.2.

Класс 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.