Здравствуйте, хабровчане!
Сегодня мы тут припозднились, но все-таки продолжаем развивать тему языка Python, по которому у нас готовится новая книга, и допечатывается . На сей раз мы хотели затронуть интересную тему перехода с PHP на Python, попутно рассмотрев некоторые фреймворки Python, поговорить о веб-разработке на этих языках и, конечно же, дать вам пищу для размышлений.
Приятного чтения и хороших выходных!
Что «говорят люди»
Программисты, имеющие мнение о том, как обстоят дела в Интернете, охотно высказываются и по поводу PHP. Время от времени кто-нибудь напишет такую филиппику , в которой расскажет, чем плох PHP , и почему все должны избегать этого языка. Вам посоветуют перейти на Java, Ruby, Python – на что угодно, только бы слезть с PHP. Хотя я не могу полностью осудить PHP, притом, что некоторое время назад по пояс увязал в импровизированной базе кода на этом языке, слова «красивый», «выразительный» и «поистине объектно-ориентированный» пробуждают во мне некие чувства, которые PHP решительно не удовлетворяет, при всех своих неловких и противоречивых попытках «исправиться».
Но когда я, наконец, перемахнул через забор и отправился туда, где трава зеленее, я ожидаемо обнаружил, что и на райском лугу кое-где попадаются проплешины. Более того, я обнаружил, что переход на другие языки означает для PHP-программиста серьезный сдвиг парадигмы. Поскольку я не видел, чтобы кто-нибудь уже об этом рассказывал, решил сам написать для вас эту путеводную статью.
Что же такое PHP?
Если вы начали карьеру веб-разработчика с языка PHP, как и я, то, вероятно, разделяете мои предубеждения о том, что представляет собой веб-разработка. Но давайте для начала выясним, что такое язык PHP.
Система шаблонов
В основе своей PHP – это система шаблонов. Вероятно, когда-то ее укусил радиоактивный паук, и она мутировала в массивный объектно-ориентированный язык – но, в сущности, так и осталась системой шаблонов. Смысл этого утверждения лучше всего прояснить на следующем примере: что происходит при обращении к PHP-документу в браузере?
Вот почему можно записывать HTML прямо в PHP-файл (вне тегов), и он будет работать. В принципе, PHP – это HTML-файл (даже если в нем нет «сырого» HTML), доказательство тому – предварительная обработка документа перед выдачей.
Фреймворк
Кроме того, PHP – своего рода минимальный фреймворк. Он оказывает вам кое-какие любезности (например, разбирает HTTP-запросы, преобразуя их в аккуратные массивы вроде $_GET и $_POST) и предоставляет гигантскую библиотеку дополнительных функций — например, для соединения с базой данных и обработки изображений.
Важно осознавать это и понимать, что PHP как таковой (без учета каких-либо сторонних аддонов или уровней абстрагирования) уже в готовом виде решал за веб-разработчика массу проблем. Эта поддержка временами была хороша, временами – не очень; но, в любом случае, проблемы редко решаются единственным способом. Легко принять за истину, что PHP решает задачи единственно верным, каноническим образом. Привыкните к тому, что это не так.
Плох, но не так уж плох.
Как я уже говорил, люди всегда будут клясть PHP — можете даже не сомневаться. Если вы в состоянии прочесть статью «PHP: фрактал некачественного проектирования », а затем с чистой совестью программировать на нем дальше – что ж, вы проявили твердость. У PHP действительно есть недостатки, от мелких прыщиков до серьезных структурных проблем.
Но, в конечном итоге, дело за вами, вашим софтом и пользователями вашего софта. Потенциальные недостатки PHP — пустая академическая мишура, пока не отражаются на этих трех китах; предположу, что в большинстве случаев действительно не отражаются. Не каждый пытается написать новое браузерное супер-пупер приложение, которое откроет путь к Web 3.0. Некоторые люди просто хотят автоматизировать простые операции у себя на персональном сайте, либо построить простую CRUD-систему для данных, которыми пользуются на работе. Не ведитесь на ненависть к PHP и не отказывайтесь от нормального инструмента, который вполне неплохо решал ваши проблемы, не требуя дополнительной настройки.
Что такое Python, и как написать на нем веб-приложение?
Python – универсальный язык программирования. В нем просто куча библиотек, и на этом языке можно решать самые разные задачи, но, в принципе, этот язык не затачивался под какие-либо конкретные цели.
Кроме того, работать с ним – одно удовольствие.
Однако он не является ни веб-фреймворком (даже минимальным), ни системой шаблонов. Если вы планируете применять Python для веб-разработки примерно столь же активно, как и PHP, то Python потребуется дополнить этими вещами.
Я упоминаю об этом, поскольку в мире PHP также есть свои фреймворки и системы шаблонов – например, Zend Framework или CakePHP. Лично я использовал CodeIgniter на двух-трех сравнительно крупных проектах, и нашел его очень полезным… поначалу. Поддерживая код (и совершенствуя непрерывную интеграцию) пару лет подряд, я разочаровался в этом фреймворке. Обнаружил, что все, что мне требовалось от фреймворка, на деле достигается при помощи пары сотен строк вспомогательных функций при условии аккуратного планирования структуры классов. Итак, мне «фреймворк» поначалу показался огромной пушкой для стрельбы по воробьям.
Если вы ощущали нечто подобное, то поймете, что в Python потребуется использовать фреймворк – хотя бы самый скромный – так как (напоминаю) вы уже привыкли к работе с минимальным фреймворком под названием PHP.
То же касается системы шаблонов. Сначала я думал, «люди, чего вы возитесь с этой системой шаблонов», но, в самом деле, если вы не фанат больших кусков HTML с «несинтаксической» подсветкой в своем логическом коде (наверняка не фанат!), то придется работать с системой шаблонов.
Итак, усвоив это, давайте рассмотрим некоторые фреймворки и системы шаблонов.
Веб-фреймворки Python
Едва подавшись в мир фреймворков Python вы немедленно окажетесь перед выбором, напоминающим обоюдоострый клинок. Фреймворков здесь – десятки , от минимальных и низкоуровневых до выраженно абстрагированных программных пакетов, прибамбасов в которых больше, чем на поясе у Бэтмена. Я работал всего с несколькими из них, поэтому остановлюсь на тех, которые знаю — примерно в том порядке, в котором я их изучал.
mod_python и серверные страницы python
Прежде, чем я «освоил» веб-разработку на Python, я, разумеется, рассматривал ее с точки зрения PHP-разработчика. Поэтому сразу проникся mod_python и серверными страницами Python (PSP). Такая конструкция позволяет работать с Python примерно так, как вы привыкли программировать на PHP: пишете сценарий, и Apache выполняет его в нужном месте, как только получит запрос GET или POST на этот сценарий. Данный сценарий может представлять собой как чистый Python, так и html-файл со встроенными PSP (в принципе, PSP – это система шаблонов, для работы с ней просто вставляете теги (с разделителем <% %>), как привыкли делать в PHP).
На первый взгляд все кажется замечательным, но со временем вы осознаете, что практически не улучшили структуру и безопасность вашего приложения по сравнению с PHP, зато променяли все веб-ориентированные вкусности PHP на язык с чуть более (ладно, гораздо более) качественным синтаксисом. В общем, из пустого в порожнее, поэтому я никогда и не видел большой пользы в переходе на mod_python.
По-видимому, сообщества Python и Apache со мной согласны, так как в 2010 году проект mod_python был закрыт. Невелика потеря, скажу я вам.
Если произнести в переполненной комнате «Веб-фреймворк Python?» то, вполне возможно, они просто недоуменно на вас посмотрят, но если кто-то и ответит, то, вероятно, скажет: «Django». Некоторые считают Django единственным веб-фреймворком Python, достойным обсуждения.
Django – это полноценный фреймворк; в нем встроено практически все необходимое, и со всем этим сразу можно работать. Там есть и шаблоны, и абстракция базы данных/объектно-реляционное отображение, сеансы и безопасность и даже собственный веб-сервер.
Несмотря на многообразные возможности и популярность, Django мне не приглянулся по нескольким причинам:
Во-первых, мне в самом деле не импонирует работа в стиле «все, что вам когда-либо может понадобиться, у нас уже есть». Я предпочитаю более мелкие, модульные инструменты, при помощи которых могу легко выстраивать код.
Во-вторых, поскольку это один из тех фреймворков, где проект запускается при помощи специальной команды «init», которая выдает вам целое дерево сгенерированного кода, посреди которого вы пишете свое приложение. Возможно, я ошибаюсь, но по опыту такая ситуация чревата неудобными обновлениями, которые приходится точечно инъецировать в код приложения.
Наконец (и здесь я тоже могу ошибаться) мне показалось, что Django задумывался для управления структурой и кодом базы данных, поэтому не очень хорошо будет работать с имеющейся базой данных. Поскольку передо мной очень часто ставились задачи написать альтернативные клиентские интерфейсы или инструменты отчетности для готовых баз данных (зачастую доступных только для чтения), мне он не подходит.
Повозившись с Django несколько дней, я все бросил и вернулся к PHP.
CherryPy
После Django меня по нескольким причинам заинтересовал CherryPy. Во-первых, он не генерирует такого большого дерева трафаретного кода, а представляет собой просто библиотеку, которую нужно импортировать. Гораздо важнее, что он не привязан к конкретной системе шаблонов или уровню базы данных, поэтому вы можете использовать любые их варианты (или не использовать вообще). Знакомясь с ним, я все еще считал, что «не нужна мне никакая система шаблонов», а проект, за который я брался, вообще не имел отношения к базе данных. Поэтому такой минимальный фреймворк идеально мне подошел.
Мне удалось написать приятную утилиту, которой я до сих пор пользуюсь при работе, но ощущения остались противоречивые. Спишите это на мою неопытность в веб-разработке на Python, но, в целом, у меня возникли две проблемы с проектом на CherryPy:
Может быть, со временем и опытом, подробнее изучив документацию CherryPy, я бы его освоил, но в данном случае меня ждала срочная работа, которую пришлось делать на PHP.
Наконец, я открыл Flask. Подобно CherryPy, это простая библиотека, которую всего лишь нужно импортировать — и можно пользоваться любой системой шаблонов или уровнем базы данных, что вам приглянутся (хотя, складывается впечатление, что Flask хорошо интегрирован с jinja2). Пока Flask меня вполне устраивает, он более прямолинеен, чем CherryPy, без всей этой автомагии, связанной с именами функций и переменных. Мне пришлось попотеть над тем, как он анализирует данные из сложных форм (по-видимому, не любит вложенные массивы). Кроме того, он помог мне осознать собственную потребность в языке шаблонов, а также узнать практически все необходимое о Jinja2 буквально за десять минут.
Системы шаблонов Python
Не буду распространяться здесь о системах шаблонов, так как до сих пор мне доводилось использовать лишь Jinja2; но здесь хотелось бы дать совет таким же PHP-разработчикам, как и я, которые еще полагают, что не нуждаются в таких системах. Ребята, окажите себе услугу и начните работать с системой шаблонов. Помните, что PHP — в сущности, одна из них, поэтому не думайте, что раньше с такими системами не работали (работали, но просто не осознавали этого). Не поступайте так, как я в моем проекте на CherryPy, просто то есть, не записывайте ваш HTML прямо в строки и не используйте подстановку в стиле printf(). Да, это сработает, но будет сделано топорно, вы не получите правильной подсветки синтаксиса и смешаете представление с логикой.
Однако не пытайтесь выбрать какую-то определенную систему шаблонов. Все они почти одинаковы, только синтаксис отличается. Я выбрал Jinja2, так как она хорошо интегрируется с Flask и, по-видимому, довольно быстра. Но на самом деле с новой системой шаблонов можно разобраться за какие-нибудь полчаса.
Что мне особенно понравилось в системе Jinja2 (и у других систем шаблонов, вероятно, также есть такое свойство) — так это возможность наследовать от других шаблонов. Так, я могу создать базовый шаблон для всех страниц с определенными именованными блоками, затем сделать так, чтобы другие шаблоны наследовали от этого и могли добавлять конкретные блоки, которые им, возможно, потребуется изменить. В PHP все было сложнее: там приходилось создавать различные элементы страницы (заголовок, область навигации, контент), прибегая к функциям или методам класса.
Некоторые общие соображения, которые следует усвоить
Итак, вы подобрали для себя фреймворк и систему шаблонов, но остались определенные концепции, с которыми вы привыкли работать, а также вредные привычки, от которых вы хотите избавиться, чтобы писать веб-приложения на Python.
Веб-страница — не STDOUT
Если в PHP вы хотели что-нибудь вставить на веб-страницу, то просто делали эхо-запрос. Поскольку мы просто делаем препроцессинг документа на месте, все, изрыгнутое PHP, окажется на веб-странице. Это оптимальный стиль программирования на PHP, именно так там решаются проблемы с кодом. Признаться, многие PHP-разработчики и отладку выполняют именно так (применяя echo или var_dump() в произвольной точке кода, чтобы посмотреть, что там происходит).
Фреймворки Python, например, Flask или CherryPy, работают иначе. В них вы пишете функции, возвращаете фрагмент HTML, который фреймворк уже упаковывает в HTTP-отклик. Итак, в отличие от PHP, если вы «print» что-нибудь, то оно не окажется на итоговой веб-страницы, а отправится туда, куда уходит весь стандартный вывод.
Мне было несложно к этому адаптироваться, поскольку примерно так я и писал приложения на PHP: они у меня строились как наборы функций, возвращающих фрагменты HTML. Однако для некоторых PHP-программистов, привыкших запрашивать данные при помощи echo, такой подход покажется очень неестественным.
Маршрутизация
Выше я описывал, как сервер обрабатывает запрос к PHP-файлу. В принципе, если я перейду по ссылке http://example.com/lib/docs/help , веб-сервер попробует найти /lib/docs/help/index.(запрос). Если окажется, что “запрос” означает “php”6, то PHP получит файл, сделает свое дело, и все будут довольны. Если подходящего индексного файла не найдется, то вы получите ошибку 404, а может и 403. Короче говоря: если вы хотите обеспечить доступ к URL при помощи PHP (если не колдовать с настройками конфигурации веб-сервера, например, не писать mod_rewrite), то должны расположить PHP-файл по этому URL.
В современных фреймворках Python это делается иначе. Сделать конкретный URL, получив с сервера HTML-страницу в качестве отклика, можно и в том случае, когда фактически нужные файлы и не расположены по этому пути. Для таких случаев во фреймворке имеется система для отображения URL на функции или классы вашей программы. Обычно этот процесс называется «маршрутизацией».
Итак, чтобы в вышеприведенном примере сделать рабочий URL на сайте, написанном с применением фреймворка Python, можно не класть никаких файлов в /lib/docs/help, да и вообще не создавать эти директории под webroot. Просто организуйте, чтобы ваш код отображал путь ‘/lib/docs/help’ на функцию или класс, которые бы возвращали конкретный отклик (фрагмент HTML или, скажем, HTTP-объект).
Некоторые фреймворки PHP или приложения обеспечивают нечто похожее на такую маршрутизацию (вроде “pretty/simplified/clean URLS”), при этом обычно используется mod_rewrite, скрывающий запрос к конкретному php-файлу.
Прежде, чем я взялся за программирование веб-приложений на Python, я не так хорошо ориентировался в HTTP. Если вы просто работаете с PHP, то, вероятно, знаете, что информация может отправляться на сервер в виде запросов “GET” или “POST” и знаете, в чем разница между такими запросами, записанными в адресной строке. Оказывается, HTTP далеко не ограничивается GET и POST, и если вы работаете с Python, то весьма целесообразно понимать этот протокол целиком.
Дело не в том, что фреймворки Python не абстрагируют HTTP; просто они его абстрагируют иначе, нежели PHP – и, честно говоря, абстрагируют чище и естественнее. Например, тогда как PHP предоставляет содержимое HTTP-запроса вашему сценарию при помощи серии глобальных массивов (напр. $_GET, $_SERVER, т.д.) или вызовов функций (напр. getallheaders()), фреймворки Python обычно предоставляют вам тот или иной объект запроса, инкапсулирующий весь HTTP-запрос.
Если учесть, что фреймворки Python и приложение на нем обрабатывают многие вещи, которые PHP просто делегирует серверу, то вполне логично, что вам придется несколько плотнее познакомиться с HTTP; не пугайтесь. Чем больше я учусь, тем больше склоняюсь к мысли, что HTTP в самом деле проще той мешанины, в которую его абстрагирует PHP.
Если вы работали с одним или несколькими известными PHP-фреймворками (напр., с CodeIgniter), то, вероятно, встречали термин «MVC». MVC – это стратегия проектирования ПО, при которой ваше приложение четко подразделчется на три части:
Модель – это ваша модель данных, обрабатывающая все операции считывания/записи данных, связанные с базой данных или хранилищем данных.
Представление – это интерфейс, который видит конечный пользователь и с которым он, собственно, работает.
Контроллер, обеспечивающий взаимодействия между представлением и моделью.
Если вы не работали с фреймворком или уже освоили паттерн MVC, то вас ждет шок. У меня сложилось впечатление, что фреймворки Python практически навязывают идею MVC на том или ином уровне. В конечном итоге, это положительно скажется на вашем коде, а без использования таких паттернов становится сложно масштабировать реальное приложение. Однако здесь придется немало изучить, если вы привыкли просто запихивать запросы к базе данных и бизнес-логику между большими кусками HTML по мере необходимости.
Планирование и проектирование
Да, «реальные программеры» здесь могут немного поморщиться, но если вы собираетесь расстаться с PHP, то должны привыкнуть, что теперь придется уделять больше внимания планированию веб-приложения. Если PHP в чем-нибудь и прекрасен, то именно в том, что позволяет сесть в кресло и написать что-то масштабное без особой предварительной подготовки. Просто вставляете код там, где он должен прийтись кстати.
Фреймворки Python, с которыми мне приходилось иметь дело, подходят к этому вопросу строже. Это не PHP, где вы просто ломитесь через сценарий сверху вниз; поэтому здесь вы не можете просто произвольно определять что заблагорассудится и рассчитывать, что эти вещи окажутся в области видимости, как только они вам потребуются. Аналогично, язык шаблонов – это просто язык шаблонов, а не полноценный язык программирования. Нельзя просто так поместить в шаблоне кучу вызовов функций и операций присваивания переменных лишь потому, что вам так нравится.
Кроме того, в таких фреймворках как Flask используются многие паттерны проектирования и абстрактные конструкции, назначение которых отнюдь не очевидно для людей, не изучавших всерьез теорию программирования. Чтобы правильно задействовать эти конструкции, требуется на более абстрактном уровне представить себе, что именно делает ваше приложение.
В конечном итоге, это пойдет вам на пользу, поскольку придется проектировать более качественные и аккуратные приложения, чем, возможно, получились бы у вас на другом языке. Но это предполагает абсолютно новый образ мышления и подход к работе.
Недостатки Python
Кроме необходимости переключиться на новую парадигму, которую я описал выше, Python имеет и некоторые характерные недостатки, проявляющиеся при веб-разработке. Думаю, было бы честно упомянуть здесь о них.
Развертывание
Чтобы развернуть приложение на PHP, достаточно лишь сбросить файлы.php в каталог под webroot. Развернуть приложение на Python несколько сложнее, это можно сделать несколькими способами, и у каждого из них есть свои достоинства и недостатки, которые необходимо взвесить.
Разумеется, ваш веб-хост может не поддерживать Python, Flask или любые другие библиотеки Python, требуемые для работы вашего приложения.
Доступ к базе данных
Если вы хотите углубиться в высокоуровневые абстракции, извлекающие из вашего кода весь противный SQL и заменяющие его объектами и вызовами методов, то Python покорит вас своими слоями ORM, например, SQLAlchemy. Если мы с вами единомышленники, и вы предпочитаете писать собственный SQL, то ситуация немного меняется.
В PHP есть приятный уровень абстрагирования базы данных, так называемый PDO, и если вы его еще не используете – прекратите набивать “mysql_” и используйте. PDO – это единая библиотека с согласованными классами, методами и свойствами, не зависящая от конкретного драйвера базы данных, который вы используете.
В свою очередь, Python обладает DB-API — это спецификация, описывающая создание библиотек для работы с базами данных в Python. Вместо библиотеки с драйверами для различных баз данных Python предоставляет библиотеки, специфичные для каждого продукта, которые (в основном) соответствуют DB-API. Теоретически все должно идти столь же гладко, как и с PDO, но на практике ситуация более разношерстная. Некоторые библиотеки расширяют DB-API дополнительными функциями, а сама спецификация гибко описывает, как должны реализовываться те или иные вещи (например, стиль параметров для параметризованных запросов). Мне это показалось неудобным, когда (например) я портировал Flask-приложение, написанное для psycopg2 (популярная библиотека PostgreSQL) на cx_Oracle (единственная библиотека Oracle, соответствующая DB-API) и бы вынужден корректировать кучу кода из-за различий в интерпретации спецификации.
Разумеется, можно было бы использовать ORM…
Акцент на программировании приложений
По-видимому, такие фреймворки как Flask или CherryPy предполагают, что вы пишете именно приложение, а не случайный набор произвольного веб-контента. Это отлично, если вы действительно пишете приложение, но ведь так бывает не всегда. Иногда просто пишется страница, перед отображением которой требуется выполнить какие-либо вычисления, либо форму, перед отправкой которой нужна какая-то простая обработка.
Если, допустим, вы ведете сайт с блогом, содержащим несколько разделов с контентом, почти не связанных друг с другом, причем большая часть контента унаследована и трогать ее не требуется, то PHP как раз вам подойдет. Если вы собираетесь добавить новую страницу, никак не связанную с остальным сайтом, но требующую предварительной обработки (например, просмотреть каталог MP3-файлов и отобразить информацию ID3 information), то достаточно написать новый.php-файл и положить его в каталог.
Если бы мой сайт управлялся приложением на Python, все было бы сложнее. Мене пришлось бы либо написать и развернуть новое приложение WSGI (слишком много работы ради одной страницы), либо добавить в имеющееся приложение новую функцию (усложнив, а, возможно, и дестабилизировав весь сайт).
Нужно ли переходить?
Я не из тех блоггеров, которые стали бы вас убеждать перейти с PHP на Python или на какой-нибудь другой язык. PHP в обозримом будущем никуда не денется, для многих приложений он совершенно адекватен. Но я скажу, что время, потраченное на изучение языка вроде Python, а также на освоение его популярных фреймворков, пойдет на пользу любому веб-программисту.
На самом деле, я дозрел до перехода на Python, когда стал все активнее прибегать к AJAX и обнаружил, что мои проекты превращаются из наборов динамических страниц в приложения на JavaScript, которые время от времени связываются с сервером для считывания и записи данных. Иными словами, когда мой серверный код чаще стал передавать вызовам AJAX операции чтения и записи в базу данных, нежели генерировать целые страницы отформатированного HTML, мне стало удобнее работать с фреймворками Python.
Ваши страницы состоят в основном из HTML и лишь кое-где содержат немного динамического контента.
Ваша работа будет развертываться на дешевом разделяемом веб-хостинге
Вы считаете, что пишете не «приложение», а просто «веб-страницы»
Если вы всерьез занимаетесь веб-разработкой и сами контролируете свой сервер, то следующий большой проект стоит написать на Python. Очень вероятно, что многие задачи по унаследованным проектам вы так и будете решать на PHP; но работу с Python стоит постоянно наращивать.
Django is an extremely popular and fully featured server-side web framework, written in Python. The module shows you why Django is one of the most popular web server frameworks, how to set up a development environment, and how to start using it to create your own web applications.
Before starting this module you don"t need to have any knowledge of Django. Ideally, you would need to understand what server-side web programming and web frameworks are by reading the topics in our Server-side website programming first steps module.
A general knowledge of programming concepts and Python is recommended, but is not essential to understanding the core concepts.
Note : Python is one of the easiest programming languages for novices to read and understand. That said, if you want to understand this module better, there are numerous free books and tutorials available on the Internet to help you out. (new programmers might want to check out the Python for Non Programmers page on the python.org wiki).
The following assessment will test your understanding of how to create a website using Django, as described in the guides listed above.
DIY Django mini blog In this assessment you"ll use some of the knowledge you"ve learned from this module to create your own blog.От автора: после создания нескольких бэкендов на PHP уважающий себя программист начинает искать альтернативу этому языку. Кто-то выберет Java и будет прав. Но то, кто захочет прочувствовать, что такое на Python разработка веб приложений, уже никогда не захочет работать с чем-либо другим. Язык развивается стремительно, а его коммерческое применение оправдывает себя с каждым новым проектом. Сегодня мы расскажем, почему он так хорош для web-разработки, и какие препятствия подстерегают новичка.
В отличии от PHP, который годится для web-разработки и некоторых экспериментов в других областях, Python считается универсальным языком. Он может быть одинаково хорош для мобильных приложений, «фронта» сайтов, создания программного обеспечения для борьбы с малваром и прочего. Вся суть программирования на Питоне в том, что на нем можно написать абсолютно все.
Python - сравнительно немолодой язык для web-разработки: задуман в 1980-ом, а реализован ближе к девяностым. Его автор, Гвидо ван Россум, хотел усовершенствовать язык ABC, который использовался для обучения, но имел ряд недостатков. В итоге, из хобби Россума получился высокоуровневый скриптовый PL, благодаря которому web-разработка поднялась на новый уровень.
Если сравнивать с PHP, который до сих пор является лидером в плане создания сайтов, то на Питоне весь процесс проходит значительно быстрее. К тому же, это язык, который поддерживает объектно-ориентированное программирование, что тоже является плюсом. Серьезные разработчики привыкли работать именно так.
У языка даже есть свой манифест, который принято называть философией. Ее написал Тим Петерс. Некоторые из лозунгов будем использовать. Например, с следующем заголовке.
Это один из основных лозунгов Python, который напрямую влияет на его распространенность в web-разработке. Создатели сделали упор не на мощности самого кода, а на продуктивности разработчиков, которые с ним работают. Это один из пунктов, которые отличают язык от PHP. На «препроцессоре» лучше всего получается код, который может прочитать лишь его автор. Для работы в команде такой подход не пройдет. Даже самая сложная система расчета будет выглядеть понятнее, чем стандартные приложения на Java и С-подобных. Человек, далекий от программирования на Питоне, но понимающий принципы создания программы, сможет понять общую картину.
Как только кто-то начинает критиковать язык web-разработки, важно понять причину: скорее всего, он просто широко используется, и его недостатки известны всем. Но, несмотря на распространённость, о слабых сторонах Python вы услышите нечасто. Он хорошо вписался в современный Интернет и активно продолжает развитие в сторону web. Возможно, через несколько лет его будут ассоциировать исключительно с веб-программированием.
Итак, у языков Java, С, и PHP есть своя аудитория почитателей. У каждого из них есть свои сильные стороны, которые активно ставят в упрек тем, кто пишет на Питоне. Но правда в том, что крупные компании охотно верят в Python, создавая на основу для своих бизнес-процессов. И хотя у основного конкурента в этой сфере (Java) скорость выполнения кода выше, Пайтон берет свое благодаря простоте написанной программы. Ее легче редактировать и выявлять ошибки. Ну, а если говорить о web-разработке, то здесь время исчисляется минутами. Не сумел поднять сервер, и вот - юзеры перешли к конкуренту.
В Python верят такие акулы бизнеса, как Google. Первый их кроулер был полностью реализован на Питоне. Но здесь прагматизм сыграл свою роль: через некоторое время его пришлось заменить на тот, который создали с помощью С++. Поверьте, такая нагрузка, как на Google, не ждет ни один ваш проект - создавайте на Python и не почувствуете разницы. К примеру, сервис PayPal тоже создан на Питоне, и это не мешает ему демонстрировать миру свое быстродействие. И, конечно же, известные пользователю Instagram и Spotify тоже созданы на основе Python (десктоп-версии).
Но где и правда web-разработка с помощью Python хороша, так это в создании веб-приложений статистического характера. Для этого у Питона есть даже специальная библиотека - Dash. Ее можно загрузить с помощью обычной команды в консоли и начинать разработку своего аналитического гиганта. Почти все подобные сервисы, вроде расчета популяции людей или роста курса инфляции, созданы на Питоне при помощи библиотеки Dash. Приятно и то, что созданные графики и таблицы можно преображать в плане интерфейса, будто вы работаете с CSS.
Современные тенденции и подходы в веб-разработке
Узнайте алгоритм быстрого роста с нуля в сайтостроении
Для того чтобы разработанные «аналитики» выглядели хорошо, библиотека еще и оснащена элементами Graph. Как и понятно из названия, она призвана обеспечить всеми видами графиков, которые только может представить разработчик.
В целом, вы уже понимаете, насколько хорош Python для web-разработки. Его все используют, и он эффективен. Так давайте оформим все в список преимуществ, которые характеризуют работу с этим языком программирования:
широкое распространение. Это всегда плюс, и мы уже о нем говорили. Все вокруг используют Python, даже Дисней. Следствием этого факта является то, что многое о нем уже известно. Как только вы сталкиваетесь с проблемой при программировании на Питоне, тотчас же можете обратиться за помощью в поисковик: скорее всего, вашу проблему уже кто-то решал. К тому же, для реализации практически любого проекта уже существуют заготовки, которые можно применить для себя;
разнообразие реализаций. Самая известная и каноническая - это CPython, реализация на С. Это значит, что код, написанный на нем, полностью взаимодействует с С, и библиотеки этого языка тоже можно применять для реализации. То же самое касается и языка Java. Существует и реализация на нем - Jython. Таких примеров масса, вплоть до взаимодействия Питона с Android и iOS;
простота языка. Нет, никто не говорит, что Python - это просто. Но если сравнить языки с такими же возможностями, то он явно впереди всех. Это значит, что его можно использовать не только в web-разработке, но и в любой другой области, где специалисты не имеют глубоких познаний в программировании. Например, если вы изучаете астрономию и хотите проводить сложные вычисления, то Java вам точно не подойдет. Синтаксис в Python похож на обыкновенные математические операции и не несет в себе дополнительной сложности;
скорость. Не удивляйтесь, когда немного ниже вы увидите этот пункт в списке недостатков. На самом деле, здесь все относительно. Несмотря на то, что программирование на Питоне может создавать более медленный код, чем Java или С, он все же значительно более быстр, чем JavaScript, PHP или Ruby. К тому же, за последние несколько лет проект PyPy сумел значительно «ускорить» Питон.
Но из всего этого списка, ключевым аспектом, конечно же, является простота. Благодаря низкому входному порогу к программированию присоединяется больше людей. К примеру, существуют даже детские реализации Python, которые стимулируют детей к программированию. А если ваш ребенок в средней школе начинает решать школьные задачи на Питоне, тогда к ее окончанию он точно будет знать, чем хочет заниматься в жизни.
Именно с этим лозунгом хочется начать рассказ о недостатках Python. Язык настолько быстро развивается, что уже через несколько лет наши слова будут неактуальными. Активно проводится работа над проблемами, которые сегодня преследуют web-разработку на Python.
Как и обещали, первой и единственной из них будет скорость. Именно на ней завязаны все последующие недостатки. Существует несколько подходов, объясняющих, почему этот язык работает медленнее, чем его статические собратья (С-семья и Java). Первый настаивает на том, что причиной всему Gil - Global Interpreter Lock. И это правда: замок блокирует потоки для того, чтобы не разрушить данные, которые в них перемещаются. Как только опасность минует, он их освобождает. Эта технология призвана обеспечить стабильность, но, как результат, замедляет работу. Хорошая новость в том, что программисты придумали массу решений этой проблемы, а в новой версии языка сам процесс значительно оптимизирован.
Вторая причина может быть в динамической типизации. Когда-то это был инструмент, который облегчает задачу начинающим разработчикам. Но в больших проектах следить за динамическими данными будет сложно. Потому web-разработка таких приложений с помощью Python требует опыта. Такие компании, как Dropbox, решают эту проблему благодаря специфическим реализациям - проект Pyston.
На этом у нас все! Учите Python! Используйте Python!
Современные тенденции и подходы в веб-разработке
Узнайте алгоритм быстрого роста с нуля в сайтостроении
Данная статья посвящена трем важным в разработке приложений понятиям: Python, а также веб-серверам и наиболее важным их отличиям.
Эта довольно длинная статья может показаться слишком утомительной для тех, кто ищет краткое руководство или хочет быстро получить ответы на свои вопросы. К сожалению, в отличие большинства действий и задач в Python, когда речь идет о выборе сервера производства для развертывания приложения, единственно верного или хотя бы предпочтительного способа сделать это нет.
Тем не менее, это не так страшно. Данная статья подробно описывает различные веб-серверы, их функции и обработку приложений на основе Python. Это поможет принять решение, какой из серверов больше отвечает требованиям того или иного проекта.
На сегодняшний день количество взаимозаменяемых веб-серверов (или модулей для серверов), специально разработанных или адаптированных для размещения веб-приложений Python, постоянно растет. Но так было не всегда. Ранее разработчики не имели возможности легко сменить веб-сервер при необходимости, и каждый переход с одного сервера на другой означал новые зависимости и ограничения. Также это касалось фреймворков для разработки приложений. Это было связано с отсутствием общепринятых технических характеристик интерфейса (т.е., общей основы, которую будут использовать для соединения похожие фреймворки и веб-серверы, что обеспечивает взаимозаменяемость компонентов с минимальными изменениями кода).
В начале этого века были приложены все усилия, чтобы, наконец, представить публике Python Enhancement Proposal (PEP) 333.
Из PEP (Python Enhancement Proposal) 333:
This document specifies a proposed standard
interface between web servers and Python web
applications or frameworks, to promote web
application portability across a variety of
web servers.
Как говорится в РЕР, этот новый стандарт обеспечивает переносимость между веб-серверами и веб-приложениями Python. Мощные функции данного стандарта и его широкое внедрение по сравнению с предыдущими серьезно повлияли на развитие серверов: на сегодняшний день существует много (возможно, даже слишком много) веб-серверов, готовых сделать всю работу самостоятельно.
В данном разделе, посвященном сравнению веб-серверов для приложений Python, речь пойдет о некоторых популярных доступных серверах. Цель данного раздела – дать читателю четкое представление о серверах и помочь подобрать соответствующий требованиям приложения сервер. В связи с огромным количеством веб-серверов, которое невозможно охватить в рамках одной статьи, далее будут описаны только «выдающиеся» серверы (т.е., наиболее популярные, наиболее надежные, или же обладающие более мощными функциями по сравнению с остальными машинами).
Примечание: рекомендуется относиться с осторожностью к предвзятым и обманчивым тестам, не стремящимся отразить условия реальной среды производства. К сожалению, подобные статьи не помогут в выборе веб-сервера для производства, а, напротив, только собьют с толку. Также рекомендуется оценить и понять свои собственные потребности, а затем попробовать различные варианты серверов.
На самом деле, CherryPy – это фреймворк. Тем не менее, он полностью автономен (то есть, может работать сам по себе, в том числе на стадии производства, и не требует дополнительного программного обеспечения). Это осуществляется благодаря собственному веб-серверу WSGI, совместимому с HTTP/1.1. Проект CherryPy описывает его как «готовый к производству высокоскоростной общий HTTP-сервер». Поскольку это WSGI-сервер, он может обслуживать любое другое приложение Python WSGI, не привязываясь к фреймворку для разработки приложений CherryPy.
Gunicorn – автономный веб-сервер с обширной функциональностью, предоставленной в удобном виде. Он использует pre-fork модель (это значит, что что главный процесс управляет инициированными рабочими процессами различного типа, которые затем обрабатывают запросы). И все это можно настроить и адаптировать относительно потребностей проекта и разнообразных сценариев производства.
Tornado – это фреймворк для разработки приложений и сетевая библиотека, созданная для обработки асинхронных операций, что позволяет таким серверам поддерживать большое множество открытых соединений. Поставляется с сервером WSGI, который могут использовать для запуска другие приложения и фреймворки WSGI Python.
Хотя, в таких случаях можно также использовать Gunicorn с асинхронными исполнителями Tornado.
Twisted Web – это веб-сервер, который поставляется с сетевой библиотекой Twisted. Тогда как сама библиотека Twisted является «событийно-управляемым сетевым механизмом», сервер Twisted Web работает на WSGI, следовательно, может содержать другие веб-приложения Python.
Несмотря на очень запутанное соглашение об именах, сам uWSGI является обширным проектом, который состоит из большого количества компонентов, которые предоставляют полный набор программного обеспечения для построения хостинговых услуг. Один из этих компонентов, сервер uWSGI, запускает приложения Python WSGI. Он может использовать различные протоколы, в том числе и собственный протокол uwsgi, идентичный SCGI. Поскольку автономные HTTP-серверы по сравнению с серверами приложений более популярны, веб-серверы NGINX и Cherokee разработаны как модульные, что позволяет uWSGI использовать собственный протокол с высокой производительностью и обеспечивает прямой контроль над процессами.
Waitress – это сервер Python WSGI. На первый взгляд может показаться, что он не обладает существенными отличиями, однако его философия разработки отделяет его от остальных серверов. Его целью является упрощение процессов разработки и производства, достаточно сложных на серверах Python. Для этого Waitress нейтрализует конфликты, вызванные различиями платформ (например, Unix vs. Windows), интерпретаторов (CPython vs. PyPy) и версий Python (версия 2 vs 3).
Простыми словами, mod_python – это модуль Apache, который встраивает Python непосредственно в сервер. Хотя использовать его не всегда рекомендуется, он может запускать приложения WSGI на Apache с помощью оболочек.
Среды Web-разработки на языке Python, Часть 1
Среда Web-разработки Django на языке Python, от установки до законченного Web-сайта
Проект Django представляет собой настраиваемую пользователем среду разработки. Он берёт начало из Web-сайта одной онлайн-газеты и был выпущен как система с открытым исходным кодом в июле 2005 года. Главные компоненты среды разработки Django следующие:
Эта статья - первая из двух статей о среде Web-разработки на языке Python. Вторая статья представит вам среду разработки TurboGears.
Чтобы использовать и понимать код в данной статье, вам необходимо установить Python и знать, как им пользоваться на начальном уровне. Проверьте, есть ли у вас Python, и какой версии, набрав python -V . Минимальным требованием Django является версия 2.3.5, которая доступна вам на Web-сайте Python (см. ссылку в разделе в конце статьи). Вам также следует хотя бы немного быть знакомым с архитектурой MVC.
В этой статье используется разрабатываемая версия Django для того, чтобы воспользоваться преимуществами последних улучшений, внесённых в среду разработки Django. Я рекомендую вам использовать эту версию до появления версии 0.95. Узнайте о наличии последней версии Django на его Web-сайте (снова см. ссылку в ).
Чтобы скачать и установить Django вам нужно:
После установки Django вам необходим инструмент администрирования Django, а именно django-admin.py, добавленный в переменную окружения path. Листинг 2 показывает некоторые из команд, доступных инструменту администратора:
Чтобы начать проект Django, используйте команду программы django-admin startproject вот так:
Показанная выше команда создает директорию под названием djproject, которая содержит файлы базовой конфигурации, необходимые для работы проекта Django:
В этом проекте вы создадите приложение для отдела занятости, называемое "jobs." Для создания приложения используйте скрипт manage.py , который является специальным для проекта скриптом в django-admin.py, в котором автоматически задаётся файл settings.py:
Это создает костяк приложения с одним модулем Python для ваших моделей и другим для ваших видов (view). Директория jobs будет содаржать следующие файлы:
Местоположение приложения внутри проекта является чистой условностью, созданной для новых разработчиков в Django, а не требованием. Как только вы начнете перемешивать и сопоставлять приложения в нескольких проектах, вы можете поместить приложения в их собственные пространства имён для модулей и связать их вместе, используя настройки и главные файлы URL. Но пока, следуйте приведенным ниже этапам.
Чтобы Django знал о новом приложении, вам необходимо добавить строку в поле INSTALLED_APPS в файле settings.py. Для этого приложения для отдела занятости нужно добавить строку djproject.jobs:
У Django есть своя собственная библиотека object-relational mapper (ORM), которая поддерживает динамический доступ к базам данных через объектный интерфейс Python. Интерфейс Python является очень удобным и эффективным, но вы также можете отказаться от него и напрямую использовать SQL при необходимости.
На данный момент ORM предоставляет поддержку для баз данных PostgreSQL, MySQL, SQLite, а также Microsoft® SQL.
Это пример использует SQLite, в качестве интерфейса к базе данных. SQLite является легковесной базой данных, не требующей конфигурации и располагается на диске в виде простого файла. Чтобы использовать SQLite, просто установите библиотеку pysqlite с помощью инструментов установки (setuptools) (см. дополнительную информацию об инструментах установки (setuptools) и, в частности, об инструменте easy_install , который вам необходимо установить отдельно, в разделе ):
easy_install pysqlite
Перед тем, как работать с моделью, сконфигурируйте базу данных в файле настроек. Для SQLite необходимо указывать только движок и имя базы данных.
Это приложение для отдела занятости будет иметь два типа объектов: Местоположения (Locations) и Работы (Jobs). Местоположение включает в себя поля города, штата (по желанию), а также страны. Работа имеет местоположение, должность, описание и дату публикации.
Метод __str__ - это специальный метод класса в языке Python, который возвращает строковое представление объекта. Django достаточно широко использует этот метод, когда отображает объекты в инструменте администратора.
Чтобы увидеть схему базы данных для модели, запустите manage.py с командой sql . Схема пока еще не будет задействована.
Для инициализации и установки модели, запустите команду синхронизирования базы данных syncdb:
~/dev/djproject$ python manage.py syncdb
Отметим, что команда syncdb просит вас создать учетную запись суперпользователя. Это происходит потому, что приложение django.contrib.auth, которое предоставляет базовые средства аутентификации пользователя, установлено по умолчанию в ваших настройках INSTALLED_APPS. Имя суперпользователя и пароль будут использоваться для регистрации в инструменте администратора, описанном в следующем разделе. Помните, что это имя и пароль суперпользователя Django, а не системы.
Модели Django обращаются к базе данных через изначально установленный Управляющий (Manager) класс, называемый objects . Например, чтобы вывести список всех Работ, вам нужно использовать метод all , принадлежащий менеджеру objects:
Управляющий класс также имеет методы фильтрации, называемые filter (фильтрация) и exclude (исключение). Фильтрация получает все объекты, подходящие под условия, тогда как исключение дает все объекты, не подходящие под них. Нижеследующие запросы должны дать такие же результаты ("gte" означает "greater than or equal,"(больше или равно) и "lt" означает "less than")(меньше чем).
Методы filter и exclude возвращают объекты QuerySet, которые можно связать в цепочку и которые могут даже представлять соединения. Запрос q4 , приведенный ниже, будет находить работы, начиная с 1-го января 2006 года, в г. Кливленд (Cleveland), штат Огайо:
Это хорошо, что QuerySets ленивы. Это означает, что они не выполняются в базе данных, пока не произошла их оценка, и благодаря чему работают гораздо быстрее, чем мгновенные запросы.
Эта леность является очень практичной в сочетании с рассекающей (slicing) функциональностью языка Python. Вместо того, чтобы запрашивать все записи, а затем отсекать нужные записи, нижеследующий код использует смещение (OFFSET), равное 5, и предел (LIMIT), равный 10, в настоящем запросе SQL, весьма улучшая качество выполнения.
Примечание: Используйте метод count , чтобы понять, сколько записей находятся в QuerySet. Метод len в Python делает полную оценку, а затем подсчитывает количество рядов, возращенных в виде записей, тогда как метод count делает действительный Подсчет (COUNT) SQL, который гораздо быстрее. И ваш администратор баз данных поблагодарит вас.
Для более подробной информации, см. раздел для ссылки на "Справочник по интерфейсу API базы данных" для Django.
Одно из самых больших достоинств в Django - это отточенный интерфейс администратора. Этот инструмент был создан с учетом конечного пользователя, благодаря чему предоставляет вашим проектам отличное средство для ввода данных.
Инструмент администратора представляет собой приложение, которое идет вместе с Django. Перед тем, как его использовать, его необходимо установить так же, как и приложение jobs . Сперва нужно добавить модуль приложения (django.contrib.admin) в настройки INSTALLED_APPS:
Чтобы сделать инструмент администратора доступным из адреса (URL) /admin, просто раскройте скобки комментария в строке, в предоставленном вам файле urls.py вашего проекта. В следующем разделе будет рассматриваться конфигурация URL более подробно.
Пиложение администратора имеет свою модель базы данных, которую необходимо установить. Снова используйте команду syncdb , чтобы завершить следующее:
python manage.py syncdb
Чтобы увидеть инструмент администратора, вы можете использовать тест-сервер, которая прилагается к Django.
Теперь вы можете переместиться в инструмент администратора по адресу http://localhost:8000/admin и зарегистрироваться, используя данные администратора, созданные вами ранее. Вы заметите, что ни одна из ваших моделей не доступна для пользования.
Чтобы открыть доступ к классу через инструмент администратора, создайте для него подкласс Admin (Администратора). Затем вы можете настраивать то, как их можно администрировать добавлением характеристик классов к данному подклассу. Листинг 19 показывает, как добавлять класс Location (Местонахождения) к интсрументу администратора.
Теперь вы можете создавать, обновлять и удалять записи Местонахождения (Location) через интерфейс администратора.
Вы можете выводить и сортировать Записи (Records) по городам, штатам и странам, в зависимости от характеристики класса list_display .
Инструмент администратора имеет большое количество опций для управления каждым из классов моделей. Листинг 20 показывает несколько примеров, примененных к классу Job:
В соответствие с вышеупомянутыми настройками, при выводе записей работ (job) будут использоваться: заголовок работы (job), местонахождения и дата издания. Работы будут располагаться в порядке даты издания, начиная с самого последнего (знак минус означает - в порядке убывания). Пользователи могут найти работы по заголовку и описанию, а администраторы могут фильтровать записи, исходя из их местонахождения.
Система передачи адресов URL в Django использует модули конфигураций регулярных выражений, которые отображают строковые шаблоны URL в методах языка Python, называемые видами . Эта система позволяет совершенно четко отделять адреса URL от кода, что делает их максимально легкими для управления.
Модуль urls.py создается и определяется в качестве начала отсчета конфигурации URL (с помощью значения ROOT_URLCONF в модуле settings.py). Единственное требование для файла конфигурации URL состоит в том, что он должен содержать объект, определяющий шаблоны, называемые urlpatterns .
Приложение управления работой (job) будет начинаться с index-видом и детальным (detail) видом, которые доступны через настоящие отображения URL:
Оба этих вида (index и детальный вид) будут выполнены в модуле, называемом views.py в приложении работ. Выполнение этой конфигурации в файле urls.py проекта будут выглядеть следующим образом:
Отметьте кусочек кода
На практике лучше всего - вытаскивать шаблоны URL, специальные для приложений, и помещать их в само приложение. Это отделяет приложение от проекта и позволяет повторно его использовать. Файл конфигурации URL уровня приложений для работ (jobs) будут выглядеть так:
С тех пор, как методы видов исходят из одного модуля, для настройки djproject.jobs.views в качестве корневого имени модуля можно использовать первый аргумент, и Django использует его для того, чтобы искать методы index и detail:
Чтобы связать в одно целое адреса (URL), перечисленных выше работ (job), назад в проект, необходимо использовать функцию include . Адреса (URL) уровня приложений теперь связаны в разделе /jobs:
Если вы попытаетесь войти на начальную (index) страницу (http://localhost:8000/jobs) на этом этапе, используя тест-сервер, вы получите ошибку, так как вид, который будет называться (djproject.jobs.views.index), еще не существует.
Вид представляет собой простой метод языка Python, который принимает объект отклика и отвечает за:
В Django вызванный метод языка Python, когда запрашивается URL, называется видом , а страница, закаченная и отрендеренная, видом называется шаблоном . По этой причине, команда разработчиков Django говорила о Django, как о среде разработки с MVT (model-view-template - модель-вид-шаблон). С другой стороны, TurboGears называет свои методы контроллерами , а отрендеренные шаблоны видами , что действительно позволяет использовать аббревиатуру MVC. Разница лишь в использовании слов, но смысл остается тем же.
Самый простейший из возможных видов возвращает объект HttpResponse (http отклик), инициализированный в строковый тип. создайте следующий метод и сделайте из /jobs HTTP-запрос, чтобы проверить, что ваши файлы urls.py и views.py правильно настроены.
Следующий код получает последние 10 работ (job), рендерит их через шаблон и возвращает отклик. Это не будет работать без файла шаблона из .
В вышеприведенном коде шаблон назван, как строковый jobs/job_list.html Рендеринг шаблона происходит в контексте списка работ (job), названном object_list . Отрендеренный шаблон строки попадает в конструктор HTTPResponse, который отправляется назад в клиент запроса с помощью среды разработки.
Этапы загрузки шаблона, создающие контекст и возвращающие новый объект отклика, перемещены ниже с помощью удобного метода, называемого render_to_response . Также новым является метод детального (detail) вида, который использует удобный для этого метод get_object_or_404 , чтобы осуществить выборку объекта Job, используя приведенные аргументы. Если объект не найден, то выдается ошибка 404. Эти два метода избавляют программу от большого количества стандартных кодов, используемых в большинстве Web-приложений.
Отметим, что detail берет object_id в качестве аргумента. Этот номер упоминался раньше, после URL-пути /jobs/ к файлу работ (job) urls.py. Он проходит дальше в метод get_object_or_404 в качестве первичного ключа (primary key - pk).
Приведенные выше виды все еще не будут работать, потому что шаблоны, которые они загружают и рендерят (jobs/job_list.html и jobs/job_detail.html) еще не существуют.
Django предоставляет простой язык шаблонов, спроектированный для быстрого рендеринга и простоты использования. Шаблоны Django создаются из простого текста, встроенного в {{ переменные }} и {% тэги %} . Затем происходит замена переменных на значения, которые они несут. Тэги используются в качестве основы логики управления. Шаблоны можно использовать для генерирования любого формата текстов, включая HTML, XML, CSV и простой текст.
Первое, что нужно сделать - это определить местонахождение шаблонов. Для простоты, создайте директорию для шаблонов внутри директории djproject и добавьте его путь в строке TEMPLATE_DIRS файла settings.py:
Шаблоны в Django поддерживают концепцию, называемую наследованием шаблонов , которая позволяет дизайнерам сайтов создавать однородный вид и функциональность без повторения содержания в каждом из шаблонов. Вы можете использовать наследование, определяя документ скелета, или основы, с блочными тэгами. Эти блочные тэги заполняются шаблонами страниц с содержанием. Этот пример показывает скелет кода на HTML с блоками, называемыми title , extrahead и content:
Чтобы приложение было отдельно от проекта, используйте вспомагательный файл основы, в качестве основы для всех файлов страниц приложения Job. Для этого примера, поместите CSS приложения в файл основы для упрощения. В реальном приложении, с хорошо сконфигурированным Web-сервером, возьмите данный CSS и поместите его в статичный файл, обслуживаемый Web-сервером.
Изначально, тест-сервер в Django не обслуживает статичные файлы, потому что эту работу должен выполнять Web-сервер. Если во время разработки вы захотите, чтобы Django работал с картинками, листами стилей и так далее, тогда см. ссылку в о том, как включить эту возможность.
Теперь создайте 2 шаблона страниц для загрузки и рендеринга. Шаблон jobs/job_list.html просто выполняет итерацию через object_list (список объектов), который он получает через контекст, выдаваемый index-видом, а также отображает ссылку на каждую из страниц с подробной информацией о записи.
Страница jobs/job_detail.html показывает одну запись, называемую job (работа):
Язык шаблонов в Django был спроектирован с ограниченными функциональными возможностями. Эта ограниченность позволяет сохранять простоту шаблонов для непрограммистов и ограждает программистов от использования бизнес-логики там, где ее не должно быть, в слое представления. См. ссылку на документацию по языку шаблонов в .
Django идет вместе с четырьмя наборами универсальных видов , которые позволяют разработчикам создавать приложения, следующие типичным шаблонам:
Вместо создания методов стандартных видов, вся бизнес-логика находится в файле urls.py и управляется с помощью методов универсальных видов, поддерживаемых Django.
Три важных изменения в данном файле urls.py:
Этот проект следует некоторым требованиям, чтобы переход к универсальным видам произошел автоматически:
Больше опций можно задать через info_dict , включая значение paginate_by , которое определяет число объектов на странице.
Следующая статья этого выпуска будет рассматривать TurboGears, другую среду Web-разработки на языке Python, и будет сравнивать его с Django.