Web2py фреймворк / Хабр
Я не изобретатель очередного велосипеда
, а просто хочу рассказать про python фреймворк WEB2PY. На Хабре почему-то нет каких-либо статей про этот чудесный инструмент. Если интересно, под хабракатом небольшая история использования web2py и его описание.
Начав изучать фреймворк, я смог создать несколько серьезных проектов, получил профит от их продажи… и продолжаю получать доход на их обслуживании и доработке. Эта деятельность повлияла на мое отношение к жизни и… в общем, все по порядку.
Предыстория такова, что в один прекрасный день мне позвонил друг, рассказал о «тяготах» работы на автомобильном пункте пропуска (в простонародье, «таможня») и спросил, смогу ли я найти/предложить/написать ему «простенькую» программку по учету транспортных средств в зоне таможенного поста. Из его сбивчивого рассказа я смог определить лишь основные требования к проекту:
- система должна быть распределенной с числом одновременных подключений как минимум 50 пользователей
- пользовательская версия клиента должна работать на любом парке компьютерной техники
- не должно быть проблем с запуском клиентских приложений, минимум инсталляций и иных телодвижений, т. к. программа, конечно же не будет «светиться» где бы то ни было и нужна исключительно для автоматизации рутинных задач
- система должна учитывать все этапы таможенного оформления каждого транспортного средства и иметь специфичную логику направления на определенные виды контроля
- должна быть возможность создания разных отчетов
Я уже хотел было прекратить разговор, но магическое словосочетание «скажи сколько денег надо — мы заплатим» сделало свое дело и я, сказав: «Эээээ, ладно», принялся искать варианты.
Логика у меня была простая:
какой мой любимый язык программирования?
- PYTHON
как быстро сделать кроссплатформенное приложение, работающее на любом железе?
- сделать проект в виде web-приложения. Браузеры-то у всех есть!
как обойти ограничение таможенных правил на посту и оптимизировать установку приложения в существующей локальной сети?
- проект должен состоять из серверной и клиентской частей. Сервер (он же база) должен обрабатывать клиентские запросы
- нужен сервер, ну или какая-нибудь более-менее приличная станция
- нужно пользователям дать возможность только открыть браузер и перейти по указанному адресу в локальной сети
как быть с базой?
- нужна простая база, желательно без необходимости ее установки и какого-то сложного сопровождения
Эта нетривиальная задача, на первый взгляд, оказалась легко разрешимой. Ответ — web2py. На тот момент я ничего не знал про этот фреймворк. Но если есть желание и упертость, то нет ничего невозможного! К тому же мне очень хотелось проверить свои силы в написании приложений для массового использования.
На сайте проекта скачиваем последнюю версию, распаковываем архив — и уже почти все готово! В корневом каталоге есть web2py.exe для win, web2py.app для osx, а также можно запустить проект так: python web2py.py. При старте следует указать пароль сервера, IP и порт (по умолчанию 8000). После запуска можно открыть браузер и перейти по адресу сервера IP:port.
Запустится уже готовый тестовый проект welcome.
По кнопке ADMINISTRATIVE INTERFACE попадаем в админку, где можно управлять сайтами.
Сайты хранятся отдельно друг от друга в каталоге APPLICATIONS. При создании нового сайта автоматически создается новый каталог с именем сайта и формируется требуемая структура каталогов. Если новый сайт назвать INIT, то он будет запущен автоматически при старте: http://192.168.0.2:8000. Если же требуется открыть какой-то другой сайт, то просто нужно указать его имя, например: http://192.168.0.2:8000/welcome.
Разобраться в принципах работы web2py очень легко. Важно понять, что для работы нужно манипулировать тремя основными компонентами:
- модель (model) — это файл db.py в каталоге models
- контроллер (controller) — это файл default.py в каталоге controllers
- вид (view) — это обычные html файлы в каталоге views/default
В db. py определяется подключение к базе и создаются нужные таблицы, например так:
db=DAL('sqlite://storage.db') #подключение к базе db.define_table('image', #создание новой таблицы с именем image Field('name'), #поле для имени Field('file','upload')) #поде для загрузки файлов
В контроллере default.py пишем python функции, например так:
def index(): form = SQLFORM(db.image) #создаем форму загрузки файлов в таблицу image if form.process().accepted: #проверяем, если все ОК, то response.flash = 'image uploaded' #выдаем сообщение return dict(form = form) #переменные , которые передаются из функции
Чтобы отобразить в браузере результат выполнения функции нужно создать html документ с именем функции в каталоге views/default, например так:
{{extend 'layout.html'}} #документ будет использовать шаблон <h2>Image upload form</h2> {{form}} #вставляем форму
Вот результат этих простых манипуляций:
Выбираем файл и сохраняем его в базу. Думаю, что проще просто быть не может!
База sqlite3 работает «из коробки», кроме этого позволяет подключать PostgreSQL, MySQL, MSSQL, FireBird, Oracle, IBM DB2, Informix, Ingres, and Google App Engine.
В процессе написания кода у меня не возникло каких-либо серьезных проблем. На сайте фреймворка есть раздел с подробной документацией и с примерами! Все на английском языке. У фреймворка также есть своя google группа web2py-users (кстати, уровень и скорость ответов иногда просто удивляют!). Глубокое и осмысленное чтение документации дало свои результаты и примерно через месяц у меня уже была готова рабочая система, которую мы успешно внедрили. Внедрение — это конечно, громко сказано. Я просто передал каталог на флешке, который нужно было положить на сервер и запустить батник. В качестве сервера люди сами купили какую-то PC станцию. Благо, люди попались понимающие и знали, как узнать/установить/изменить IP адрес, как запустить службу и перейти в браузере по адресу с указанием порта. А то я было подумал, что это будет самой трудной задачей.
Сейчас могу с уверенностью сказать, что система работает уже больше двух лет. Никто к серверу не подходит (ну, кроме как пыль продуть), ошибок нет, в среднем число одновременных подключений примерно 50, сопровождения не нужно, все довольны. Таким образом, я «прокачал» свои навыки, узнав много нового в python; получил опыт общения и переписки на английском; заработал деньги в конце концов. Ничего этого могло бы и не быть, если бы не уверенность в успехе и постоянная тяга к знаниям. После этого проекта я получил еще заказ, потом еще и еще…
PS
Рад, что мой первый стартовый топик на Хабре посвящен именно web2py!
PPS
Этим топиком еще раз хочу направить многих из нас на курс обучения. На Хабре много топиков о необходимости изучения английского, об on-line курсах coursera (прохожу третий курс, записан еще на два), о других видах стимулирования личного развития. Хочу сказать, что это действительно работает! Проверено на личном опыте.
Создание приложения Python при помощи Web2py
21 февраля, 2016 12:24 пп 3 591 views | Комментариев нетPython, Ubuntu | Amber | Комментировать запись
Python – это универсальный высокоуровневый язык программирования, который часто применяется в веб-программировании.
Создание веб-приложения может оказаться утомительной и трудной задачей; для её решения существуют фреймворки -программы, которые выполняют основную часть кодирования и позволяют выбрать шаблоны для разработки веб-приложения.
Python поддерживает множество разных фреймворков, и web2py – один из наиболее интересных.
web2py – это полнофункциональный фреймворк, предназначенный для разработки веб-приложений. Он может взаимодействовать с базами данных SQL, предоставляет многопоточный веб-сервер, и поставляется с IDE для разработки программы. Все это позволяет сделать процесс программирования гораздо быстрее.
Данное руководство поможет установить фреймворк web2py на сервер Ubuntu 12.04.
Установка web2py
Сервер Ubuntu поставляется с предустановленным пакетом Python, а это единственная зависимость web2py.
В дальнейшем может понадобиться утилита unzip, которая распаковывает архивы. Установите её сейчас, если она не была установлена ранее.
sudo apt-get update
sudo apt-get install unzip
Теперь можно загрузить пакеты фреймворка с сайта проекта в домашний каталог:
cd ~
wget http://www.web2py.com/examples/static/web2py_src.zip
Распакуйте полученные пакеты при помощи unzip:
unzip web2py_src.zip
Откройте каталог фреймворка:
cd web2py
Фреймворк web2py не нуждается в установке. Достаточно просто загрузить пакеты в соответствующий каталог и распаковать их. После этого можно сразу запустить фреймворк:
python web2py. py
Однако эта команда запускает только веб-интерфейс, доступный на локальной машине. Это функция безопасности, но в данном случае она не работает, поскольку фреймворк находится на удалённой машине.
Нужно исправить ошибку доступа. Чтобы остановить сервер, нажмите CTRL-C в терминале.
Создание SSL-сертификата
Чтобы исправить ошибку доступа и разрешить удалённый доступ к фреймворку, нужно запустить его при помощи SSL. Для этого нужно создать сертификат. Пакет openssl установлен в системе Ubuntu по умолчанию.
Создайте ключ RSA, который необходим для создания сертификата.
openssl genrsa -out server.key 2048
При помощи этого ключа можно создать файл .csr:
openssl req -new -key server.key -out server.csr
Теперь используйте эти компоненты для создания сертификата.
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Теперь в каталоге web2py есть файлы server. key, server.csr и server.crt. Их можно использовать для запуска интерфейса в безопасном режиме. Для этого при запуске web2py нужно добавить следующие параметры:
python web2py.py -a 'admin_password' -c server.crt -k server.key -i 0.0.0.0 -p 8000
Примечание: Установите надёжный пароль вместо условного пароля ‘admin_password’.
Чтобы получить удалённый доступ к интерфейсу, укажите в команде 0.0.0.0.
Теперь можно открыть интерфейс:
https://your_ip:8000
На экране появится предупреждение о том, что SSL-сертификат не подписан надёжным центром сертификации.
The site’s security certificate is not trusted!
Это нормальное поведение, поскольку сертификат является самоподписанным. Такое предупреждение можно проигнорировать.
Разработка приложения в интерфейсе
Посетив сайт, вы увидите приложение web2py по умолчанию.
Welcome
Hello World
How did you get here? [. ..]
Нажмите на кнопку Administrative Interface и введите установленный ранее пароль, чтобы получить доступ к интерфейсу.
На экране появится список установленных приложений; это три папки в левой части экрана. Они содержат стандартные приложения и образцы приложений. Если кликнуть по папке, можно просмотреть приложение в действии. К примеру, на данный момент открыто приложение admin, которое отвечает за работу интерфейса. Ранее вы видели стандартное приложение Hello World, которое хранится в папке welcome.
Все приложения, кроме admin, можно редактировать в интерфейсе, открыв выпадающее меню Manage и выбрав Edit. Чтобы вернуться назад после редактирования, нажмите ссылку Site в верхней панели навигации.
Попробуйте создать новое приложение. Найдите справа поле New simple application, введите имя приложения и нажмите кнопку Создать.
Примечание: В данном руководстве приложение условно называется sample_app.
На экране появится интерфейс для редактирования приложения. Он показывает список стандартных файлов MVC (модели, виды, контролеры), каталогов языков, каталогов статических страниц, модулей, плагинов и личных файлов.
Это, по сути, простая графическая презентация состояния файловой системы. Чтобы убедиться в этом, можно остановить сервер (CTRL-C) и перейти в подкаталог applications/sample_app в каталоге web2py. Он содержит все эти категории.
Реализация шаблона MVC
Web2py берет на себя большую часть базовых задач, касающихся разработки приложения.
Web2py основывается на политике «coding by convention». Coding by convention – это метод разработки, позволяющий уменьшить количество решений, которое должен принять разработчик, без ущерба для гибкости приложения.
К примеру, если контроллер приложения называется imageblog.py и имеет функцию main, web2py попытается обслужить его при помощи вида imageblog/main.html. Расширение .html используется по умолчанию, если другие расширения не были заданы. Нарушив данное соглашение, придётся выполнять множество работы самостоятельно. Следуя соглашению, можно сэкономить время, так как большинство задач автоматизируется.
Если контроллер не указан, используется контроллер по умолчанию – default.py. Чтобы просмотреть функции контроллера, нажмите кнопку Edit.
Чтобы вернутся в основной интерфейс редактирования, нажмите Edit в верхней панели навигации.
Создание контроллера и вида
Попробуйте создать свой собственный контроллер. Откройте раздел Controllers и нажмите Create. Выберите имя контроллера.
Если открыть этот контроллер для редактирования, можно увидеть, что он вызывает функцию index, если другая функция не указана. Эта функция просто выводит значение переменной message (hello from hello.py).
# coding: utf8
# try something like
def index(): return dict(message="hello from hello.py")
При необходимости можно отредактировать контроллер.
После этого нужно создать вид, который будет отображать обработанные данные. Нажмите кнопку Edit или <<back, чтобы вернуться в каталог приложения.
В разделе Views создайте новый вид. Чтобы вид применялся автоматически, его имя должно состоять из имени контроллера и имени функции. То есть если контроллер называется hello, а функция index, то в данном случае вид будет называться hello/index.html.
Чтобы отредактировать файл, нажмите кнопку слева от него. Стандартный вид включает в себя следующий код:
{{extend 'layout.html'}}
<h2>This is the hello/index.html template</h2>
{{=BEAUTIFY(response._vars)}}
Этот файл расширяет вид layout.html. Такой метод позволяет сохранить единый стиль между всеми страницами. Посетите страницу в браузере, чтобы убедиться, что всё работает.
https://your_ip:8000/sample_app/hello
На экране появится следующий текст:
Sample app
This is the hello/index.html template
message : hello from hello.py
Попробуйте изменить последние две строки. Следующий код уберёт весь ненужный контент и будет выводить на экран только текст сообщения.
{{extend 'layout.html'}}
<h2>{{=message}}</h2>
Теперь на экране появится только сообщение от контроллера:
Sample app
hello from hello.py
Компонент {{=message}} позволяет встраивать код Python в файлы приложения. Таким образом можно динамически генерировать контент, который не обязательно должен быть доступен на момент написания программы.
Заключение
Данное руководство охватывает только базовые функции фреймворка web2py.
Гибкие текстовые файлы и удобный веб-интерфейс позволяют разработать любую необходимую приложению среду.
Кроме того, веб-интерфейс поставляется с большим количеством инструментов для работы с растущим приложением. Они позволяют просмотреть трассировку стека при возникновении ошибки, легко упаковать приложение для развертывания, получить доступ к логам ошибок и многое другое.
Tags: MVC, Python, SSL, Ubuntu 12.04, Web2pyweb2py — Предисловие
Глава 0: Предисловие
Я считаю, что способность легко создавать высококачественные веб-приложения имеет решающее значение для роста свободного и открытого общества. Это не позволяет крупнейшим игрокам монополизировать поток информации.
Поэтому в 2007 году я начал проект web2py
, прежде всего в качестве обучающего инструмента с целью сделать веб-разработку проще, быстрее и безопаснее. Со временем ему удалось завоевать любовь тысяч знающих пользователей и сотен разработчиков. Наши совместные усилия создали одну из самых полнофункциональных веб-платформ с открытым исходным кодом для корпоративной веб-разработки.
В результате в 2011 году web2py
получил премию Bossie Award за лучшее программное обеспечение для разработки с открытым исходным кодом, а в 2012 году получил награду «Технология года» от InfoWorld. Благодаря усилиям растущего сообщества в 2017 году web2py был окончательно доработан для поддержки Python 3 (но он по-прежнему совместим со старым Python 2.7!).
Как вы узнаете на следующих страницах, web2py
пытается снизить барьер входа в веб-разработку, сосредоточив внимание на трех основных целях:
Простота использования . Это означает сокращение времени обучения и развертывания, а также затрат на разработку и обслуживание. Вот почему web2py
— это фреймворк с полным стеком без зависимостей. Он не требует установки и не имеет файлов конфигурации. Все работает из коробки , включая веб-сервер, базу данных и веб-IDE, которая дает доступ ко всем основным функциям. API включает всего 12 основных объектов, с которыми легко работать и которые легко запомнить. Он может взаимодействовать с большинством веб-серверов, баз данных и всех библиотек Python.
Быстрое развитие . Каждая функция web2py
имеет поведение по умолчанию (которое можно переопределить). Например, как только вы укажете свои модели данных, вы получите доступ к веб-панели администрирования базы данных. Кроме того, web2py
автоматически создает формы для ваших данных и позволяет легко отображать данные в HTML, XML, JSON, RSS и т. д. web2py
предоставляет некоторые виджеты высокого уровня, такие как вики и сетка, для быстрого создания сложных Приложения.
Безопасность . Уровень абстракции базы данных (DAL) web2py
устраняет SQL-инъекции. Язык шаблона предотвращает уязвимости межсайтового скриптинга. Формы, сгенерированные web2py
, обеспечивают проверку полей и блокируют подделки межсайтовых запросов. Пароли всегда хранятся в хешированном виде. Сеансы по умолчанию сохраняются на стороне сервера, чтобы предотвратить подделку файлов cookie. Файлы cookie сеанса имеют UUID для предотвращения перехвата сеанса.
web2py
построен с точки зрения пользователя и постоянно оптимизируется, чтобы стать быстрее и компактнее, при этом всегда поддерживая обратная совместимость .
web2py
предоставляет своим пользователям щедрые свободы лицензии LGPL с открытым исходным кодом. Если вы извлечете из этого пользу, я надеюсь, вы почувствуете побуждение заплатить его вперед , внося свой вклад в общество в любой форме, которую вы выберете.
top
Создание нового приложения Web2Py — Python для сетевых инженеров
- Страница администратора по умолчанию
- Создать новое приложение
- Редактировать приложение
Мы собираемся создать новое приложение и запускать все наши варианты использования через это приложение. Вы можете создавать множество приложений и размещать их в одном экземпляре web2py. Например, вы можете создавать отдельные приложения для групп сетевых операций, проектирования и архитектуры. Приложение, которое мы собираемся создать, больше подходит для команды сетевых операций.
При установке Web2Py по умолчанию устанавливается несколько приложений. Одним из них является приложение администратора, которое предоставляет административный интерфейс для создания, изменения, разработки и удаления приложений. Вы можете получить доступ к приложению администратора из своего браузера, используя URL-адрес https://<веб-сервер>/admin/default/index. Вам будет предложено ввести пароль администратора. Используйте пароль, который вы установили при запуске службы web2py.
Вы увидите приложения по умолчанию, созданные как часть установки web2py.
Вы можете создавать новые приложения из интерфейса администратора. Просто укажите имя для вашего нового приложения в разделе «Новое простое приложение» и нажмите «Создать». В нашем примере мы используем имя приложения «Arista_EOS_Tool».
Будет создано новое приложение с моделями, контроллерами и представлениями по умолчанию.
Вы можете просмотреть только что созданное приложение, запустив его прямо из браузера, используя URL-адрес https://<веб-сервер>/Arista_EOS_Tool/default/index. Вы также можете запустить свое приложение из интерфейса администратора. Щелкните правой кнопкой мыши свое приложение и выберите «Открыть ссылку в новой вкладке».
Это веб-сайт по умолчанию, созданный web2py для вашего приложения.
Вы можете проверить папки и файлы, созданные web2py для вашего нового приложения на сервере Ubuntu. Вы можете увидеть приложения по умолчанию и свое приложение в папке «»/home/www-data/web2py/applications».
anees@ubuntu-web2py:/home/www-data/web2py/applications$ pwd /home/www-данные/web2py/приложения anees@ubuntu-web2py:/home/www-data/web2py/applications$ ll drwxr-xr-x 8 www-данные www-данные 4096 мар 14 16:17 . / drwxr-xr-x 11 www-data www-data 4096 14 марта 16:17 ../ drwxrwxr-x 14 www-data www-data 4096 29 декабря 12:18 admin/ drwxrwxr-x 15 www-data www-data 4096 29 декабря 12:20 Arista_EOS_Tool/ drwxrwxr-x 14 www-data www-data 4096 29 января 21:21 примеры/ -rw-rw-r-- 1 www-data www-data 1 26 декабря 04:58 __init__.py -rw-r--r-- 1 www-data www-data 111 29 декабря 12:18 __init__.pyc drwxrwxr-x 14 www-data www-data 4096 29 декабря 12:18 добро пожаловать/
В каждом приложении вы можете увидеть папки для модели, контроллеров и представлений.
anees@ubuntu-web2py:/home/www-data/web2py/applications$ cd Arista_EOS_Tool/ anees@ubuntu-web2py:/home/www-data/web2py/applications/Arista_EOS_Tool$ ll drwxrwxr-x 15 www-data www-data 4096 29 декабря 12:20 ./ drwxr-xr-x 8 www-data www-data 4096 14 марта 16:17 ../ -rw-rw-r-- 1 www-data www-data 55 дек 26 04:58 О drwxr-xr-x 2 www-data www-data 4096 29 декабря 12:19 кэш/ drwxrwxr-x 2 www-data www-data 4096 29 декабря 12:21 контроллеры/ drwxrwxr-x 2 www-данные www-данные 4096 26 декабря 04:58 cron/ drwxr-xr-x 2 www-данные www-данные 4096 мая 19 09:22 бд/ drwxr-xr-x 2 www-data www-data 16384 19 мая 09:40 ошибки/ -rw-rw-r-- 1 www-data www-data 1 26 декабря 04:58 __init__. py -rw-r--r-- 1 www-data www-data 127 29 декабря 12:20 __init__.pyc drwxrwxr-x 2 www-data www-data 4096 26 декабря 04:58 языки/ -rw-rw-r-- 1 www-data www-data 208 26 декабря 04:58 ЛИЦЕНЗИЯ drwxrwxr-x 2 www-data www-data 4096 29 января 17:42 модели/ drwxrwxr-x 2 www-data www-data 4096 29 декабря 12:20 модули/ drwxrwxr-x 2 www-data www-data 4096 26 декабря 04:58 частный/ -rw-r--r-- 1 www-данные www-данные 450099 июн 10:08 progress.log -rw-rw-r-- 1 www-data www-data 1510 26 декабря 04:58 route.example.py drwxr-xr-x 20 www-data www-data 4096 6 июня 08:17 сеансы/ drwxrwxr-x 6 www-data www-data 4096 9 июня 10:07 статический/ drwxr-xr-x 2 www-data www-data 4096 29 декабря 12:19 загрузки/ drwxrwxr-x 3 www-data www-data 4096 29 января 19:44 просмотров/
Вы можете найти контроллер по умолчанию default.py в папке контроллеров.
anees@ubuntu-web2py:/home/www-data/web2py/applications/Arista_EOS_Tool$ cd контроллеры/ anees@ubuntu-web2py:/home/www-data/web2py/applications/Arista_EOS_Tool/controllers$ ll drwxrwxr-x 2 www-данные www-данные 4096 дек 29 12:21 . / drwxrwxr-x 15 www-data www-data 4096 29 декабря 12:20 ../ -rw-rw-r-- 1 www-data www-data 25689 26 декабря 04:58 appadmin.py -rw-rw-r-- 1 www-data www-data 33650 19 мая 09:45 default.py
Представления можно найти в папке «представления/по умолчанию».
anees@ubuntu-web2py:/home/www-data/web2py/applications/Arista_EOS_Tool/controllers$ cd ../views/default anees@ubuntu-web2py:/home/www-data/web2py/applications/Arista_EOS_Tool/views/default$ ll -rw-rw-r-- 1 www-data www-data 1660 9 июня10:08 index.html
Мы удалим сценарии по умолчанию из контроллера по умолчанию и представления, чтобы запустить чистое пустое приложение. Затем, начиная со следующей главы, мы начнем заполнять наши варианты использования сети в этом приложении.
Перейти в интерфейс администратора по адресу https://<веб-сервер>/admin/default/index. Нажмите кнопку «Управление» и выберите «Изменить».
Нажмите «Изменить», которая находится рядом с контроллером default.py.
Вы увидите функции по умолчанию, созданные web2py. Вы должны иметь возможность видеть представления (файлы html) для каждой функции в этом контроллере.
Удалите все сценарии из файла default.py и просто введите приведенный ниже сценарий Python.
индекс определения(): вернуть дикт()
Мы только что создали функцию index(), которая не имеет никакой логики и просто возвращает в представление пустой словарь. Сохраните сценарий.
Теперь мы очистим представление (Arista_EOS_Tool/views/default/index.html) для функции index(). Откройте представление по умолчанию для функции index() из административного интерфейса. В левом верхнем углу вы увидите переключатель файлов -> Представления -> default/index.html.
Удалите существующие html-скрипты и просто включите макет web2py по умолчанию. layout.html размещается для каждого приложения, которое вы создаете через web2py. Вы можете найти этот файл в папке представлений вашего приложения (Arista_EOS_Tool/views/).
Сохраните представление и проверьте свое пустое приложение в браузере http://<веб-сервер>/Arista_EOS_Tool/default/index.