Django поставляется с несколькими встроенными компонентами, которые помогают решать общие задачи, которые мы обсудим в следующих секциях.
Класс компонента django.contrib.auth.middleware.AuthenticationMiddleware.
Этот компонент включает механизм поддержки аутентификации. Он
добавляет атрибут request.user, представляющий
текущего авторизованного пользователя, в каждый входящий
объект HttpRequest
.
Данный компонент описан в главе «Сессии, пользователи и регистрация».
Класс компонента: django.middleware.common.CommonMiddleware.
Этот компонент добавляет несколько удобств для перфекционистов:
Запрещает доступ для пользовательских агентов, перечисленных в параметре
DISALLOWED_USER_AGENTS
: Если этот параметр определён в файле конфигурации, он должен быть представлен в виде списка объектов скомпилированных регулярных выражений, которые будут применяться к заголовкам пользовательских агентов для каждого входящего запроса. Ниже показан пример с частью конфигурационного файла:import re DISALLOWED_USER_AGENTS = ( re.compile(r'^OmniExplorer_Bot'), re.compile(r'^Googlebot') )
Следует отметить использование import re, оно необходимо для компилирования регулярных выражений (обратите внимание на re.compile()). Так как файл конфигурации является кодом на языке Python, можно спокойно использовать оператор include в нём.
Выполняет перезапись URL, основываясь на параметрах
APPEND_SLASH
иPREPEND_WWW
: Если параметрAPPEND_SLASH
имеет значение True, то URL у которых отсутствует завершающий слэш (но нет точки в последнем компоненте пути) будут перенаправляться на тот же URL только с завершающим слэшом. Таким образом, foo.com/bar будет перенаправлен на foo.com/bar/, а foo.com/bar/file.txt пройдёт не изменённым.Если параметр
PREPEND_WWW
имеет значение True, то URL, которые не имеют префикса www., будут перенаправлены на URL с этим префиксом.Оба параметра нужны для нормализации URL. Философия такова, что каждый URL должен существовать в одном и только одном месте. С технической точки зрения URL example.com/bar является отдельным представлением от example.com/bar/, которое в свою очередь — от www.example.com/bar/. Индексаторы поисковых движков будут рассматривать эти URL как отдельные, что отрицательно скажется на рейтинге вашего сайта на этом поисковике. Так что нормализация URL приносит пользу.
Обработка ETags на основе параметра
USE_ETAGS
: Etags являются оптимизацией HTTP уровня для условного кэширования страниц. Если параметрUSE_ETAGS
имеет значение True, Django будет вычислять Etag для каждого запроса, выполняя MD5-хэширование содержимого страницы, и заботиться об отправки откликов «Не изменилось», если это так.Следует отметить существование также компонента для условного GET, который поддерживает Etags и кое-что ещё.
Класс компонента: django.middleware.gzip.GZipMiddleware.
Этот компонент автоматически сжимает содержимое страниц для браузеров, которые поддерживают алгоритм gzip (все современные браузеры). Использование этого компонента может значительно снизить объём трафика, потребляемого вашим сервером. Недостатком применения этого компонента является возрастание времени отклика из-за затрат на компрессию страницы.
Обычно мы предпочитаем иметь высокую скорость отклика, а не экономию трафика, но если вы предпочитаете обратно, просто активируйте этот компонент.
Класс компонента: django.middleware.http.ConditionalGetMiddleware.
Компонент предоставляет поддержку условного GET.
Если отклик содержит заголовки Last-Modified
или ETag, а запрос содержит
If-None-Match или
If-Modified-Since, то отклик заменяется на 304
(«Не изменён»). Поддержка ETag
зависит от параметра USE_ETAGS
и ожидает
наличия заголовка ETag в отклике. Как
упоминалось ранее, заголовок ETag
устанавливается стандартным компонентом.
Данный компонент также удаляет содержимое любого отклика для запроса HEAD ??? FIXME ??? и устанавливает заголовки отклика Date и Content-Length для всех запросов.
Класс компонента: django.middleware.http.SetRemoteAddrFromForwardedFor.
Этот компонент мы разобрали ранее в секции «Что такое компоненты?». Он устанавливает request.META['REMOTE_ADDR'], используя request.META['HTTP_X_FORWARDED_FOR'], если последний установлен. Это полезно, когда вы находитесь за обратным прокси, который преобразовывает параметр REMOTE_ADDR каждого запроса в 127.0.0.1.
Опасность!
Компонент не производит проверку HTTP_X_FORWARDED_FOR.
Если вы не находитесь за обратным прокси сервером, не используйте этот компонент.Любой может сфабриковать значение HTTP_X_FORWARDED_FOR и, соответственно, подменить свой IP адрес.
Используйте этот компонент только в том случае, когда вы абсолютно доверяете значениям в HTTP_X_FORWARDED_FOR.
Класс компонента: django.contrib.sessions.middleware.SessionMiddleware.
Этот компонент обеспечивает поддержку сессий. Подробности приведены в главе «Сессии, пользователи и регистрация».
Класс компонента: django.middleware.cache.CacheMiddleware.
Этот компонент обеспечивает кэширование каждой страницы Django проекта. Подробности приведены в главе «Кэширование».
Класс компонента: django.middleware.transaction.TransactionMiddleware.
Этот компонент «подключает» операции COMMIT или ROLLBACK к фазе запроса/отклика. Если функция представления отрабатывает успешно, то выполняется COMMIT. Если представление вызывает исключение, то выполняется ROLLBACK.
Место определения этого компонента в стеке компонентов имеет значение. Компоненты вызываемые до данного компонента выполняются по стратегии коммит-по-сохранению (стандартное поведение Django). Компоненты вызываемые после — будут включены в транзакцию в которой будет работать функция представления.
Обратитесь к приложению «Справочник по API взаимодействия с базой данных» для получения подробностей о транзакциях базы данных.
Пред. | Уровень выше | След. |
Методы | Начало | Глава 16. Интеграция с унаследованным |
0 comments | Make a comment