Python веб приложение. Структурирование данных с MATLAB

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.

Prerequisites

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).

Guides

Django introduction In this first Django article we answer the question "What is Django?" and give you an overview of what makes this web framework special. We"ll outline the main features, including some advanced functionality that we won"t have time to cover in detail in this module. We"ll also show you some of the main building blocks of a Django application, to give you an idea of what it can do before you set it up and start playing. Setting up a Django development environment Now that you know what Django is for, we"ll show you how to setup and test a Django development environment on Windows, Linux (Ubuntu), and Mac OS X - whatever common operating system you are using, this article should give you what you need to be able to start developing Django apps. Django Tutorial: The Local Library website The first article in our practical tutorial series explains what you"ll learn, and provides an overview of the "local library" - an example website we"ll be working through and evolving in subsequent articles. Django Tutorial Part 2: Creating a skeleton website This article shows how you can create a "skeleton" website project as a basis, which you can then go on to populate with site-specific settings, urls, models, views, and templates. Django Tutorial Part 3: Using models This article shows how to define models for the LocalLibrary website - models represent the data structures we want to store our app"s data in, and also allow Django to store data in a database for us (and modify it later on). It explains what a model is, how it is declared, and some of the main field types. It also briefly shows a few of the main ways you can access model data. Django Tutorial Part 4: Django admin site Now that we"ve created models for the LocalLibrary website, we"ll use the Django Admin site to add some "real" book data. First we"ll show you how to register the models with the admin site, then we"ll show you how to login and create some data. At the end we show some ways in which you can further improve the presentation of the admin site. Django Tutorial Part 5: Creating our home page We"re now ready to add the code to display our first full page - a home page for the LocalLibrary that shows how many records we have of each model type and provides sidebar navigation links to our other pages. Along the way we"ll gain practical experience in writing basic URL maps and views, getting records from the database, and using templates. Django Tutorial Part 6: Generic list and detail views This tutorial extends our LocalLibrary website, adding list and detail pages for books and authors. Here we"ll learn about generic class-based views, and show how they can reduce the amount of code you have to write for common use cases. We"ll also go into URL handling in greater detail, showing how to perform basic pattern matching. Django Tutorial Part 7: Sessions framework This tutorial extends our LocalLibrary website, adding a session-based visit-counter to the home page. This is a relatively simple example, but it does show how you can use the session framework to provide persistent behaviour for anonymous users in your own sites. Django Tutorial Part 8: User authentication and permissions In this tutorial we"ll show you how to allow users to login to your site with their own accounts, and how to control what they can do and see based on whether or not they are logged in and their permissions . As part of this demonstration we"ll extend the LocalLibrary website, adding login and logout pages, and user- and staff-specific pages for viewing books that have been borrowed. Django Tutorial Part 9: Working with forms In this tutorial we"ll show you how to work with HTML Forms in Django, and in particular the easiest way to write forms to create, update, and delete model instances. As part of this demonstration we"ll extend the LocalLibrary website so that librarians can renew books, and create, update, and delete authors using our own forms (rather than using the admin application). Django Tutorial Part 10: Testing a Django web application As websites grow they become harder to test manually - not only is there more to test, but, as the interactions between components become more complex, a small change in one area can require many additional tests to verify its impact on other areas. One way to mitigate these problems is to write automated tests, which can easily and reliably be run every time you make a change. This tutorial shows how to automate unit testing of your website using Django"s test framework. Django Tutorial Part 11: Deploying Django to production Now you"ve created (and tested) an awesome LocalLibrary website, you"re going to want to install it on a public web server so that it can be accessed by library staff and members over the Internet. This article provides an overview of how you might go about finding a host to deploy your website, and what you need to do in order to get your site ready for production. Django web application security Protecting user data is an essential part of any website design. We previously explained some of the more common security threats in the article - this article provides a practical demonstration of how Django"s in-built protections handle such threats.

Assessments

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.

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

Dash значительно упрощает создание GUI (графических пользовательских интерфейсов) для анализа данных. Вот пример приложения на Dash из 43 строк кода, который связывает выпадающее меню с графиком D3.js. Когда пользователь выбирает значение в выпадающем списке, код динамически экспортирует данные из Google Finance в Pandas DataFrame:

Код Dash является декларативным и реактивным, что упрощает создание сложных приложений, содержащих множество интерактивных элементов. Вот пример с 5 входными данными, 3 - выходными и с перекрёстной фильтрацией. Это приложение было написано на Python, и в нём всего лишь 160 строк кода:

Приложение на Dash с несколькими входными и выходными данным.

Для каждого элемента приложения можно задать собственные параметры размера, расположения, цвета и шрифта. Приложения на Dash создаются и публикуются в Сети, поэтому к ним можно применить всё, на что способен CSS. Ниже иллюстрируется пример тонко настраиваемого интерактивного приложения отчётности на Dash, выполненного в стиле отчёта финансовой организации Goldman Sachs.

Тонко настраиваемое приложение Dash, созданное в стиле отчёта финансовой организации Goldman Sachs.

Вам не нужно писать какой-либо код на JavaScript или HTML, когда ваше приложение на Dash запущено в веб-браузере. Dash предоставляет богатый набор интерактивных веб-компонентов.

Import dash_core_components as dcc dcc.Slider(value=4, min=-10, max=20, step=0.5, labels={-5: "-5 Degrees", 0: "0", 10: "10 Degrees"})

Пример простого ползунка на Dash

Dash предоставляет простой реактивный декоратор для привязки вашего кода анализа данных к пользовательскому интерфейсу Dash.

@dash_app.callback(Output("graph-id", "figure"), ) def your_data_analysis_function(new_slider_value): new_figure = your_compute_figure_function(new_slider_value) return new_figure

Когда изменяется входной элемент (например, при выборе элемента в выпадающем списке или при передвижении ползунка), декоратор Dash предоставляет вашему коду Python новое входное значение.

Ваша функция Python может выполнять различные действия с новым входным значением: может фильтровать объект DataFrame библиотеки Pandas, выполнять SQL-запрос, запускать симуляцию, выполнять вычисления или запускать тестирование. Dash рассчитывает, что ваша функция вернёт новое свойство для какого-нибудь элемента пользовательского интерфейса, будь то новый график, новая таблица или новый текст.

В качестве примера ниже представлено приложение на Dash, которое обновляет текстовый элемент при взаимодействии с графиком. Код приложения фильтрует данные в Pandas DataFrame на основе выбранной точки:

Приложение ниже отображает метаинформацию о лекарственных веществах при наведении курсора на точки в графике. Код приложения также добавляет строки в таблицу, когда появляются новые компоненты в выпадающем списке.

Благодаря этим двум разделениям между компонентами Python и реактивными функциональными декораторами, Dash разграничивает все технологии и протоколы, необходимые для создания интерактивного веб-приложения. Dash достаточно прост, чтобы привязать пользовательский интерфейс к коду Python за один вечер.

Архитектура

Flask и React.js

Приложения на Dash - веб-серверы, которые запускают Flask и связывают пакеты JSON через HTTP-запросы. Интерфейс Dash формирует компоненты, используя React.js.

Flask - великолепный фреймворк, который широко используется сообществом разработчиков Python во многих проектах. Основной экземпляр Flask и все его настраиваемые свойства доступны разработчикам приложений на Dash. Продвинутые разработчики могут расширить возможности приложений с помощью богатой коллекции плагинов Flask.

React.js также великолепен, например, мы переписали всю нашу веб-платформу и наш онлайн-редактор диаграмм с помощью React. Но есть кое-что, что действительно радует насчёт React - активный и талантливый состав сообщества разработчиков, который опубликовал тысячи высококачественных компонентов, начиная с выпадающих списков и слайдеров , заканчивая календарями и . И всё это публикуется с открытым исходным кодом!

Dash использует мощь Flask и React, подстраивая их под работу с Python для специалистов по анализу и обработке данных, которые могут не быть экспертами в области веб-разработки.

От React.js к компонентам Python

Компоненты Dash - это классы Python, которые кодируют свойства и значения конкретного компонента React и упорядочиваются как JSON. Dash предоставляет набор инструментов для лёгкой упаковки компонентов React в вид компонентов, которые могут быть использованы в Dash. Этот набор инструментов использует динамическое программирования для автоматического создания классов Python из аннотированного свойства React - propTypes . На выходе классы Python, которые представляют компоненты Dash, являются удобными для пользователя, так как они имеют автоматическую проверку аргументов, строк документации и прочее.

Вот пример динамически сгенерированной проверки ошибочного аргумента:

>>> import dash_core_components as dcc >>> dcc.Dropdown(valu=3) Ошибка: неизвестный ключевой аргумент `valu` Допустимые аргументы: id, className, disabled, multi, options, placeholder, value

Пример динамически создаваемых строк документации:

>>> help(dcc.Dropdown) class Dropdown(dash.development.base_component.Component) | Компонент выпадающего списка. | Компонент выпадающего списка служит для выбора одного или более | элементов. | значения и названия элементов выпадающего списка определяются в `options` | свойство и выбранный элемент(ы) определяются свойством `value`. | | используйте выпадающий список, только если у вас много вариантов выбора (больше 5), или | когда вы ограничены пространством. В противном случае вы можете использовать переключатели или чекбоксы, | Которые покажут сразу все элементы пользователю. | | Аргументы ключевых слов: | - id (строка; необязательный) | - className (строка; необязательный) | - disabled (логический тип; необязательный): если true, выбор блокируется | - multi (логический тип; необязательный): если true, пользователь может выбрать несколько значений | - options (список; необязательный) | - placeholder (строка; необязательный): серый текст по умолчанию, если ничего не выбрано | - value (строка | список; необязательный): значение поля ввода. Если `multi` false (по умолчанию), | то value - строка, соответствующая своим значениям, | указанным в свойстве `options`. Если `multi` - true, то | можно выбрать сразу несколько значений, а `value` - | массив элементов со значениями, соответствующими в свойстве | `options`. | | Доступные события: "change

Полный набор HTML-тегов (наподобие div , img , table) также обрабатывается с помощью React, а их классы Python доступны через библиотеку dash_html_component . Основной набор интерактивных компонентов, таких как Dropdown , Graph , Slider , будет поддерживаться командой Dash через dash_core_components . Обе библиотеки используют стандартный набор инструментальных средств React-to-Dash с открытым исходным кодом, который вы могли бы использовать при необходимости написания своей собственной библиотеки компонентов.

Ваше приложение автоматически не привязывается к библиотеке компонентов Dash. Библиотека компонентов импортируется отдельно от основной библиотеки Dash. С помощью набора инструментальных средств React-to-Dash можно легко записать или перенести компонент React.js в класс Python, который можно использовать в приложении Dash. На официальном сайте вы найдёте руководство по созданию собственных компонентов или можете попросить команду разработчиков Dash написать их для вас.

Многопользовательские приложения

Свойства приложения на Dash хранятся в интерфейсе (в браузере). Это позволяет использовать приложения, написанные с использованием Dash, в многопользовательском режиме: может быть открыто несколько независимых друг от друга сессий, в которых действия одних пользователей не будут влиять на данные других пользователей. Код приложения на Dash является функциональным: он может считывать значения из глобальных свойств Python, но не может вносить в них изменения. Этот функциональный подход можно легко обосновать и протестировать - это просто входные и выходные данные без каких-либо побочных эффектов или свойств.

CSS и стили

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

Визуализация данных

Библиотека Dash поставляется с компонентом Graph, который отвечает за отображение диаграмм с помощью Plotly.js. Библиотека Plotly.js отлично подходит к Dash (отличное дополнение), так как она декларативна и имеет открытый исходный код. Кроме того, она поддерживает полный спектр научных, финансовых и деловых диаграмм. Она создана на основе D3.js (для диаграмм типографического качества и экспорта векторных изображений) и WebGL (для высокопроизводительной визуализации).

В библиотеке Dash элемент Graph использует тот же синтаксис, что и библиотека Plotly.py с открытым исходным кодом, что даёт вам возможность легко переключаться между ними. Компонент Graph подключается к системе событий Plotly.js, позволяя авторам писать приложения, которые реагируют на наведение курсора, щелчки и выбор определённых точек на графиках Plotly.

Репозитории с открытым исходным кодом

  • документация и руководство по Dash;
  • Plotly.js  -JavaScript- библиотека, используемая Dash.

Прототипирование

Dash - это новая библиотека в среде Python, однако концепции и идеи, на которых строится Dash, существуют в течение десятилетий на разных языках и в разных приложениях.

Если вы разбираетесь в Excel, значит, вам будет проще разобраться и в Dash. Ведь они оба используют «реактивную» модель программирования. В Excel ячейки с выходными данными обновляются автоматически при изменении параметров ячеек с входными данными. Любая ячейка может быть входной или выходной или и тем, и другим. В ячейках с входными данными нет информации о том, какие ячейки с выходными данными зависят от них, что упрощает добавление новых ячеек с выходными данными или позволяет связать несколько ячеек. Вот пример Excel-приложения:

Можно провести аналогию для Dash. Вместо ячеек у нас есть богатый спектр веб-компонентов, таких как ползунки, поля ввода, выпадающие списки и графики. Вместо написания сценария Excel или VBA мы пишем код Python. Ниже представлено то же самое приложение, но в этот раз оно написано на Dash:

App.layout = html.Div([ html.Label("Hours per Day"), dcc.Slider(id="hours", value=5, min=0, max=24, step=1), html.Label("Rate"), dcc.Input(id="rate", value=2, type="number"), html.Label("Amount per Day"), html.Div(id="amount"), html.Label("Amount per Week"), html.Div(id="amount-per-week") ]) @app.callback(Output("amount", "children"), ) def compute_amount(hours, rate): return float(hours) * float(rate) @app.callback(Output("amount-per-week", "children"), ) def compute_amount(amount): return float(amount) * 7

Некоторым разработчикам нравится этот пример, потому что Excel по-прежнему занимает доминирующее положение даже в технических вычислениях и в финансовой математике. Я не думаю, что доминирующее положение Excel - это технический вопрос. В конце концов, есть легионы программистов, которые изучили нюансы Excel, VBA и даже SQL.

Более того, таблицы Excel легче распространять, чем программы на Python, а ячейки Excel легче редактировать, чем аргументы командной строки.

Тем не менее, моделирование в Excel имеет известные ограничения: эти таблицы часто становятся слишком большими или уязвимыми, чтобы переводить их на производственный уровень, проводить экспертную оценку или тестировать и поддерживать. Вам ведь знаком случай со знаменитой опечаткой в 2013 году?

Надеемся, что Dash сделает использование Python в проектах по обработке данных проще. Благодаря одним и тем же функциональным и реактивным принципам, можно так же легко написать приложение на Dash, как написать аналитическую таблицу. Это, безусловно, более мощный и презентабельный инструмент.

Фреймворк Shiny

Если вы программируете на R, вам повезло. Shiny - это реактивный фреймворк для создания веб-приложений на чистом R, и это отлично! Вы даже можете создавать интерактивные графики с библиотекой Shiny или Plotly для R . Dash и Shiny похожи, но Dash не стремится быть копией Shiny, так как философии Python и R достаточно различаются, что приводит к необходимости использования разного синтаксиса.

Интерактивное веб-приложение, созданное с помощью Shiny на языке R.

Структурирование данных с MATLAB

Если вы программируете на MATLAB, то вам, возможно, знакома GUIDE - библиотека пользовательского интерфейса для MATLAB. Компания Mathworks была одной из новаторов в области технических вычислений. GUIDE была написана в далёком 2004 году.

Приложение, созданное с помощью библиотеки GUIDE на MATLAB.

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

Перекрёстная фильтрация в Tableau.

Dash также служит дополнением к BI-инструментам, наподобие вышеупомянутых. Они отлично подходят для структурирования данных. Но когда дело доходит до преобразования данных и аналитики, превзойти размах и гибкость языков программирования и сообществ, вроде Python, становится труднее. Dash абстрагируется от множества сложностей в создании пользовательских интерфейсов, позволяя вам сделать это красиво для вашей аналитической базы данных.

Виджеты Jupyter

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

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

Команде разработчиков Dash также очень нравится проект nteract , который действительно снижает порог вхождения в Python и Jupyter Notebook, позволяя упаковать Jupyter Notebook в виде настольного приложения.

Лицензирование и бизнес-модель с открытым исходным кодом

Стартап поддерживает библиотеки с открытым исходным кодом для Python, R и MATLAB, которые взаимодействуют с plotly.js. Компания также поддерживает веб-приложение для создания диаграмм и подключения их к базам данных (стыковочные библиотеки также распространяются с открытым исходным кодом).

Если вы используете локальную версию с открытым исходным кодом, в таком случае ограничений нет. Вы можете управлять развёртыванием Dash-приложений самостоятельно через платформы вроде Heroku или Digital Ocean.

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

Вам также может понравиться проект Explorable Explanations , который специализируется на интерактивном обучении.

Здравствуйте, хабровчане!

Сегодня мы тут припозднились, но все-таки продолжаем развивать тему языка Python, по которому у нас готовится новая книга, и допечатывается . На сей раз мы хотели затронуть интересную тему перехода с PHP на Python, попутно рассмотрев некоторые фреймворки Python, поговорить о веб-разработке на этих языках и, конечно же, дать вам пищу для размышлений.

Приятного чтения и хороших выходных!

Что «говорят люди»

Программисты, имеющие мнение о том, как обстоят дела в Интернете, охотно высказываются и по поводу PHP. Время от времени кто-нибудь напишет такую филиппику , в которой расскажет, чем плох PHP , и почему все должны избегать этого языка. Вам посоветуют перейти на Java, Ruby, Python – на что угодно, только бы слезть с PHP. Хотя я не могу полностью осудить PHP, притом, что некоторое время назад по пояс увязал в импровизированной базе кода на этом языке, слова «красивый», «выразительный» и «поистине объектно-ориентированный» пробуждают во мне некие чувства, которые PHP решительно не удовлетворяет, при всех своих неловких и противоречивых попытках «исправиться».

Но когда я, наконец, перемахнул через забор и отправился туда, где трава зеленее, я ожидаемо обнаружил, что и на райском лугу кое-где попадаются проплешины. Более того, я обнаружил, что переход на другие языки означает для PHP-программиста серьезный сдвиг парадигмы. Поскольку я не видел, чтобы кто-нибудь уже об этом рассказывал, решил сам написать для вас эту путеводную статью.

Что же такое PHP?

Если вы начали карьеру веб-разработчика с языка PHP, как и я, то, вероятно, разделяете мои предубеждения о том, что представляет собой веб-разработка. Но давайте для начала выясним, что такое язык PHP.

Система шаблонов

В основе своей PHP – это система шаблонов. Вероятно, когда-то ее укусил радиоактивный паук, и она мутировала в массивный объектно-ориентированный язык – но, в сущности, так и осталась системой шаблонов. Смысл этого утверждения лучше всего прояснить на следующем примере: что происходит при обращении к PHP-документу в браузере?

  • Веб-сервер (например, Apache) получает запрос на PHP-документ
  • Веб-сервер запускает PHP, передавая запрошенный файл и некоторые детали о запросе
  • PHP обрабатывает запрошенный файл, дампит все «обязательные» или «включенные» файлы, а также интерпретирует разряды “”, когда они встречаются.
  • PHP возвращает интерпретированный документ (теперь уже на чистом HTML/XML/CSS т.д.) на веб-сервер, который отправляет его в браузер.

Вот почему можно записывать 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:

  1. Существует как минимум два или три способа делать определенные вещи — например, настраивать конфигурационные опции, и документация свободно комбинирует эти способы. Один и тот же метод мог срабатывать, но не всегда; поэтому создавалось впечатление, что код мой противоречив.
  2. Многие вещи в программе требуют некой автомагической комбинации имен функций и переменных; такова, например, сеансовая аутентификация. Мне было очень сложно выполнить эту работу правильно, а отладочные сообщения не помогали.

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

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

Вопреки распространенному мнению, Python полезен не только для обработки данных и скриптов. Посмотрите на рейтинг портала HotFrameworks.com , и вы увидите, что пятый по популярности веб-фреймворк создан для работы с Python.

Python и веб-разработка

При разработке веб-приложения Python в основном используется для обработки бэк-энд и маршрутизации, где в роли конкурентов у него PHP и Ruby. Веб-страницы все равно необходимо отображать с использованием HTML и CSS, а функциональная часть фронтэнда по-прежнему выполняется на JavaScript. Если вам интересен этот язык, то рекомендуем начать его изучения с бесплатного .

В зависимости от того, какой фреймворк Python вы используете, взаимодействия могут существенно упрощаться. Например, Django имеет систему шаблонов для написания специальных HTML-файлов, которые могут вставлять код Python и взаимодействовать с данными из бэк-энда.

Такой тип взаимодействия называется full-stack фреймворком. С его помощью вы можете работать с системами, обрабатывающими HTTP-запросы, хранилищами баз данных, шаблонами веб-страниц, запросами маршрутизации и т. д. С другой стороны, есть и не full-stack фреймворки, которые также называют микрофреймворками, которые обрабатывают только базовую логику. А для сторонних работ они должны быть объединены со сторонними базами данных, шаблонизаторами и т. д.

В общем, full-stack фреймворки имеют более крутые кривые обучения и заставляют вас принимать множество решений относительно структуры, но предоставляют все, что вам нужно. Микрофреймворки могут быть изучены в кратчайшие сроки и являются более гибкими, но вам, скорее всего, каждый раз придётся изобретать велосипед.

Python против других языков

Если вы следите за текстами в нашем блоге, то уже имеете представление о популярных , например, React или Angular. Они стремительно развиваются, особенно среди новичков. Многие думают: «Если мне нужен JavaScript для внешнего интерфейса, почему бы не использовать JavaScript для back-end?» И это действительно имеет смысл. А взгляните на PHP - он существует уже много десятилетий, его окружает большое количество документации, он востребован. Тоже вполне себе логичный вариант для back-end.

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

Но отказаться от Python вам будет очень непросто, ведь для любви к нему есть минимум .

Python и фреймворки

Чтобы заняться веб-разработкой с использованием Python, вам следует серьезно рассмотреть возможность использования одного из следующих фреймворков. Каждый из них по-своему хорош, проверен временем и тысячами программистов. Поэтому будьте уверены, что существенных проблем с официальной поддержкой, сообществами или документацией не возникнет.

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

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

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

То есть если вы знаете, как и что вам необходимо использовать для реализации задумки, то Flask может стать тем минимальным клеем, что соберёт все воедино. Но если у вас нет ни опыта работы, ни понимания того, как должно функционировать будущее приложение, то Flask - далеко не лучший выбор.

Pyramid - это некий компромиссе между Django и Flask. Данный фреймворк не так функционален, как Django, и не так упрям, как Flask, но прост, удобен и вполне достаточен для организации большинства веб-приложений. Здесь есть большая библиотека официальных и неофициальных плагинов, с помощью которых вы сможете реализовать все задумки для вашего проекта.