Легкий python веб-фреймворк: Bottle

в 21:51, , рубрики: python, Веб-разработка

Введение

Недавно я осознал, что на Хабре нет ни одной статьи, посвящённой прекрасному фреймворку Bottle, которым, кстати говоря, пользуется не мало людей, поэтому в этой статье я попытаюсь рассказать вам о нем.

Установка

Bottle — очень легкий фреймворк и помещается всего в один файл — bottle.py. Установить его можно отсюда, либо сделать pip install bottle.

Возможности

Несмотря на свою минималистичность, Bottle предоставляет довольно широкие возможности, которых на 100% хватает для мелких и средних проектов. Вот список основных возможностей:

Routing

Роутинг в bottle, как и в большинстве фреймворков на питоне, осуществляется с помощью декораторов. Например:

@route('/hello/<name>')
def index(name):
    return name

Также динамические url можно составлять на основе регулярных выражений:

@route('/news/<number:re:[0-9]*>')
def show_news(number):
    pass

Templates

Одна из сильнейших сторон фреймворка — механизм шаблонов. Чтобы воспользоваться шаблонизатором, достаточно написать такую легкую конструкцию:

template('template_name', name=name, number=number, foo=bar)

Первый аргумент функции — название файла, в котором содержится текст шаблона (в нашем случае шаблон будет называться template_name.tpl).
В самом же файле нам нужно написать название переменной в двух фигурных скобках:

Hello, {{name}}, glad to see you!

По-умолчанию сделано так, что если в скобках указан html код, то он не выполнится, во избежание XSS атак. Если же нам это очень надо, можно написать {{!name}}. Также Bottle предоставляет нам очень очень крутую возможность: писать любой python код внутри шаблона. Чтобы вызвать питон, достаточно в начале строки поставить %. Например:

%a = 100500
%for i in xrange(a):
    <div class="image_{{i}}"><img src="......{{i}}.jpg"></div>
%end 

Также можно инклюдить шаблоны из шаблонов, что позволяет нам красиво и опрятно содержать шаблоны.

%include template_num2 foo=bar, blabla=qweqwe

POST-routing и обработка форм

Какой же нормальный фреймворк может существовать без возможности обработки POST запросов с последующей обработкой форм?
Механизм для обработки POST запросов абсолютно такой же, как и для обработки GET запросов, просто слово route нужно заменить на post:

@post("/url")
def foo():
    pass

Для доступа к формам используются атрибуты полей «name». Например:

<input name="age" placeholder="Возраст">

Чтобы получить содержимое формы, нужно использовать следующую конструкцию:

request.forms.get("age")  # Получить содержимое одного поля age
request.forms.getall("age")  # Получить содержимое всех полей age

Также можно обращаться и с файлами:

request.files.get("picture")  # Получить один файл из поля picture
request.files.getall("picture")  # Получить все файлы из поля (mult-upload)

Cookies

Обращаться с Cookies в bottle очень просто, чтобы установить cookie:

response.set_cookie("name", value, max_age=100500)

Чтобы взять значение:

request.get_cookie("name")

Сервер

В bottle вшит простой http сервер, который пригоден разве что для очень быстрого тестирования одной странички:

run(host='localhost', port=8080)

Естественно, что для более крупных проектов использовать его невозможно, поэтому надо как-то связать bottle с apache или nginx. Честно говоря, сам я всегда использую apache, поэтому рассказать могу только про него, но с ngninx все тоже вроде довольно просто. Bottle связывается с Apache через mod_wsgi. Для того, чтобы это реализовать, нужно сделать следующее:

  1. Создать файл adapter.wsgi с вот таким содержимым
    спойлер

    import sys, os, bottle
    sys.path.append(os.path.dirname(os.path.abspath(__file__)))
    os.chdir(os.path.dirname(os.path.abspath(__file__)))
    import index # Основной файл
    
    application = bottle.default_app()
    

  2. Установить и включить mod_wsgi
  3. Добавить настройки виртуального хоста
    спойлер

    <VirtualHost *:80>
            DocumentRoot /var/www/foo
    </VirtualHost>
    
    <Directory /var/www/foo>
            Options FollowSymLinks ExecCGI
            AddHandler wsgi-script .wsgi
            Order allow,deny
            AllowOverride All
            Allow from all
    </Directory>
    

Частые ошибки и их решения

  • Если ваш сайт работает через apache, то нужно быть очень аккуратным в работе с путями, нужно всегда использовать полные пути. Мой вам совет: где-нибудь в начале кода правильно определите рабочий каталог, а дальше просто везде его используйте. Например, вот так:
    sys.path.append(os.path.dirname(os.path.abspath(__file__)))
    os.chdir(os.path.dirname(os.path.abspath(__file__)))
    cwd = os.getcwd()
    

  • Если вы берете шаблоны из какой-то папки (например views), то обязательно нужно добавить полный путь до этой папки в список bottle.TEMPLATE_PATH

Заключение

Естественно, сложно в один пост уместить всю информацию о фреймворке, я написал лишь самое главное. Благо bottle обладает довольно хорошей документацией, так что заходите и читайте. Хороших всем выходных!

Автор: SteveNers

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js