back-end developer
0,0
рейтинг
10 сентября 2013 в 20:36

Разработка → Мега-Учебник Flask, Часть 1: Привет, Мир! перевод tutorial

Это первая статья в серии, где я буду документировать мой опыт написания веб-приложения на Python, используя микрофреймворк Flask.

Здесь список всех статей в серии:
Часть 1: Привет, Мир!
Часть 2: Шаблоны
Часть 3: Формы
Часть 4: База данных
Часть 5: Вход пользователей
Часть 6: Страница профиля и аватары
Часть 7: Unit-тестирование
Часть 8: Подписчики, контакты и друзья
Часть 9: Пагинация
Часть 10: Полнотекстовый поиск
Часть 11: Поддержка e-mail
Часть 12: Реконструкция
Часть 13: Дата и время
Часть 14: I18n and L10n
Часть 15: Ajax
Часть 16: Отладка, тестирование и профилирование
Часть 17: Развертывание на Linux (даже на Raspberry Pi!)
Часть 18: Развертывание на Heroku Cloud

Моя предыстория


Я разработчик ПО с двузначным числом лет опыта разработки комплексных приложений на нескольких языках. Впервые я познакомился с Python для создания привязок к C++ библиотеке на работе. Вдобавок к Python, я писал веб-приложения на PHP, Ruby, Smalltalk и, верите вы или нет, еще на С++. Из всего этого, я нахожу комбинацию Python/Flask самой гибкой.

Приложение


Приложение, которое я собираюсь разрабатывать как часть этого руководства, является сервером микроблогов, и я решил назвать его microblog. Довольно креативно, я знаю.

Во время нашего прогресса я затрону следующие темы:

  • Управление пользователями, включая управление входами, сессиями, ролями пользователя, профилями и пользовательскими аватарами
  • Управление базой данных, включая миграцию
  • Поддержка форм, включая валидацию полей
  • Пагинация длинных списков элементов
  • Полнотекстовый поиск
  • E-mail уведомления пользователей
  • HTML шаблоны
  • Поддержка нескольких языков
  • Кеширование и другая оптимизация производительности
  • Методы отладки для серверов разработки и продакшна
  • Установка на продакшн сервер


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

Требования


Если ваш компьютер поддерживает Python 2.6/2.7, то все, вероятно, пойдет хорошо. Приложение из руководства должно нормально работать на Windows, OS X и Linux.

Это руководство подразумевает, что вы знакомы с окном терминала (командной консолью в случае Windows), и вы знаете основные команды для работы с файлами вашей ОС. Если это не так, то перед тем как продолжить, я рекомендую вам ознакомиться с тем, как создавать директории, копировать файлы и т.д., используя консоль.

Наконец, вы должны чувствовать себя свободно в написании кода на Python. Знакомство с модулями и пакетами этого языка также не помешает.

Установка Flask


Ну что ж, приступим!
Если у вас еще не установлен Python 2.7, то берем его отсюда.

Теперь нам нужно установить Flask и несколько расширений, которые мы будем использовать. Я предпочитаю создание виртуального окружения, где все это будет установлено таким образом, что ваша основная установка Python затронута не будет. В качестве бонуса, вам не нужен будет root доступ для установки таким способом.

Итак, открываем терминал, выбираем место, где будет ваше приложение, и создаем новую папку, в которой оно будет содержаться. Назовем эту папку microblog.

Далее скачиваем virtualenv.py и кладем его внутрь новой папки.

Чтобы создать новое окружение введите следующую команду:
python virtualenv.py flask

Эта команда создаст полноценное окружение Python внутри папки flask

Виртуальные окружения могут быть активированы и деактивированы по желанию. Активированное окружение добавляет путь своей папки bin в path системы, например, когда вы вызываете интерпретатор python, то получаете версию текущего окружения, а не системную. Лично я никогда не любил это свойство, поэтому ни разу не активировал ни одно из моих окружений, вместо этого я просто вызывал тот интерпретатор, который хотел, печатая его путь.

Прим. пер.: Перед тем как вы начнете вводить команды, хочу отметить, что в комментариях к девятой части отметится баг в flask-whooshalchemy, исправленную версию можнонужно скачать отсюда (репозиторий автора)

Если вы пользователь Linux, OS x или Cygwin, установите flask и расширения, вводя следующие команды одну за одной:
Список команд
flask/bin/pip install flask==0.9
flask/bin/pip install flask-login
flask/bin/pip install flask-openid
flask/bin/pip install flask-mail
flask/bin/pip install sqlalchemy==0.7.9
flask/bin/pip install flask-sqlalchemy==0.16
flask/bin/pip install sqlalchemy-migrate
flask/bin/pip install flask-whooshalchemy==0.54a
flask/bin/pip install flask-wtf==0.8.4
flask/bin/pip install pytz==2013b
flask/bin/pip install flask-babel==0.8
flask/bin/pip install flup


Если же вы пользователь Windows, то команды слегка отличаются:
Список команд
flask\Scripts\pip install flask==0.9
flask\Scripts\pip install flask-login
flask\Scripts\pip install flask-openid
flask\Scripts\pip install sqlalchemy==0.7.9
flask\Scripts\pip install flask-sqlalchemy==0.16
flask\Scripts\pip install sqlalchemy-migrate
flask\Scripts\pip install flask-whooshalchemy==0.54a
flask\Scripts\pip install flask-wtf==0.8.4
flask\Scripts\pip install pytz==2013b
flask\Scripts\pip install flask-babel==0.8
flask\Scripts\pip install flup


Эти команды скачают и установят все пакеты, которые мы будем использовать в нашем приложении.
Учтите, что мы собираемся использовать Flask 0.9, а не последнюю версию. Flask 0.10 не было довольно долго и некоторые расширения не готовы для работы с данной версией. Также есть несколько несовместимостей между пакетами и последней версией pip, которые решены использованием конкретных версий для установки.

Windows пользователей ждет еще один шаг. Наблюдательный читаель заметит, что в списке команд для Windows отсутствует flask-mail. Это расширение не устанавливается чисто на Windows, поэтому мы пойдем обходным путем:
flask\Scripts\pip install --no-deps lamson chardet flask-mail


Я не буду вдаваться в подробности, поэтому если вы хотите узнать больше, прочтите документацию к flask-mail.

Если установка всех пакетов прошла успешно, вы можете удалить virtualenv.py, поскольку файл нам больше не понадобится.

«Hello, World!» в Flask


Теперь у вас есть подпапка flask, в вашей папке microblog, содержащая интерпретатор Python и фреймворк Flask с расширениями, которые мы будем использовать в этом приложении. Настало время написать наше первое веб-приложение!

После того как вы переместились папку microblog, давайте создадим основную структуру папок для нашего приложения:

mkdir app
mkdir app/static
mkdir app/templates
mkdir tmp


В папку app мы поместим само наше приложение. Подпапка static нужна для хранения статики, такой как картинки, javascript файлы и таблицы стилей. Подпапка templates, очевидно, предназначена для хранения наших шаблонов.

Давайте начнем с создания простого скрипта инициализации нашего пакета app (файл app/__init__.py)

from flask import Flask

app = Flask(__name__)
from app import views


Скрипт выше просто создает объект приложения (наследуя Flask), затем импортирует модуль представлений, который мы еще не написали.

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

Напишем нашу первую функцию представления (файл app/views.py)

from app import app

@app.route('/')
@app.route('/index')
def index():
    return "Hello, World!"


Это весьма простое представление, которое просто возвращает строку для отображения в пользовательском браузере. Два декоратора route создают привязку адресов / и /index к этой функции.

Последним шагом для получения полностью работающего веб-приложения будет создание скрипта, который стартует веб-сервер нашего приложения. Давайте назовем скрипт run.py и положим его в корневой каталог (microblog/):

#!flask/bin/python
from app import app
app.run(debug = True)


Скрипт просто импортирует переменную app из нашего пакета app и вызывает метод run для того, чтобы запустить сервер. Помните, что переменная app — экземпляр класса Flask, мы создали его выше.

Для запуска вашего приложения просто запустите скрипт. На OS X, Linux и Cygwin вам следует пометить файл исполняемым перед тем как вы сможете его запустить.

chmod a+x run.py


Тогда скрипт может быть вызван просто:

./run.py


В Windows процесс немного отличается. Нет необходимости помечать файл исполняемым. Вместо этого вам нужно запустить скрипт как аргумент интерпретатора Python:

flask/Scripts/python run.py


После старта сервер будет прослушивать порт 5000, ожидая соединений. Теперь откроем браузер и введем следующий URL в адресную строку:



Или же вы можете использовать эту ссылку:

http://localhost:5000/index


Теперь вы увидели маршрутизацию в действии? Первый URL привязан к /, в то время как второй к /index. Оба маршрута ассоциированы с нашей функцией представления, поэтому они дают одинаковый результат. Если вы введете любой другой маршрут, то получите ошибку, так как только эти два были привязаны к функции представления.

Когда вы закончите играть с сервером вы можете просто нажать Ctrl-C, чтобы остановить его.

И этим я хочу закончить первую часть этого руководства.

Те из вас, кто поленился печатать, могут скачать код из этого руководства ниже:

Скачать microblog-0.1.zip.

Обратите внимание, что вам нужно установить Flask, чтобы запустить приложение из архива выше.

Что дальше



В следующей части серии мы изменим наше маленькое приложение для использования HTML шаблонов.

Надеюсь увидимся в следующей части.

Мигель
Перевод: Miguel Grinberg
Ян @wiygn
карма
39,2
рейтинг 0,0
back-end developer
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (30)

  • 0
    Отлично, как раз начал читать его на английском!
    • +4
      Ну если вам торопиться некуда, то я буду публиковать по части в два-три дня.
      • 0
        Это будет просто замечательно! Спасибо!
  • 0
    Подскажите, его под 3ий Python не портировали до сих пор?
    • 0
      Ну у меня Flask 0.10.1 под Python 3.3.2 работает без нареканий. Когда же дело касается установки последних версий flask-расширений, то руки опускаются :(
      • 0
        В свое время мне его рекомендовали как легкий и быстрый в разработке, но оттолкнуло отсутствие версии для 3ьего. Не очень хотелось водружать отдельно 2ой.
      • 0
        Да, с расширениями беда под Python3. Надо чаще дергать разработчиков расширений на гитхабе.
        Хотя наиболее популярные уже портированы и активно багфиксятся например flask_script, flask_sqlalchemy, flask_login, flask_wtf. В тоже время по многим полезным расширениям даже планов нет например flask_debugtoolbar.
  • +1
    Во Flask все круто конечно, но людям, пришедшим п Python недавно, вроде меня, совсем не хочется писать на второв питоне, попробовав третий.
    • +2
      3.3 поддерживается. Расширения сейчас переводят.
      • +1
        А точно ведь — гугление подтвердило. Я отстал от времени. Спасибо за уточнение)
  • +1
    Flask отличный фреймворк. Он не диктует жесткую архитектуру проекта как к примеру Django. И в этом есть как плюсы так и минусы. А во всем остальном просто супер! :)
  • +1
    Учтите, что мы собираемся использовать Flask 0.9, а не последнюю версию. Flask 0.10 не было довольно долго и некоторые расширения не готовы для работы с данной версией.

    И после установки flask==0.9 мы тянем в зависимостях последний werkzeug, что может вызвать много неприятных багов, поэтому крайне рекомендую указывать и werkzeug==0.8.3, да и вообще все мажерные зависимости если так пошло. А вообще flask==0.10.1 у меня прекрасно работает под python 2.7:

    bleach==1.2.2
    blinker==1.2
    celery==3.0.22
    dnspython==1.11.0
    flask==0.10.1
    flask-admin==1.0.6
    flask-babel==0.9
    flask-login==0.2.7
    flask-mongoengine==0.7
    flask-oauth==0.12
    flask-restful==0.2.5
    flask-wtf==0.8.4
    jinja2==2.7.1
    jsonschema==2.0.0
    html5lib==0.95
    lxml==3.2.3
    mongoengine==0.7.10
    premailer-cspw==1.2.2
    pdfkit==0.4.1
    pymongo==2.5.2
    pyquery==1.2.4
    python-magic==0.4.3
    python-whois==0.2
    uwsgi==1.9.14
    werkzeug==0.9.3

    Еще небольшое замечание: устанавливать все зависимоти по одиночки не совсем удобно, лучше сразу описать requirements.txt с зависимостями или использовать для этого pip freeze.
  • 0
    Хотел писать подобную серию статей про Magento. Интересно будет ли спрос?

    upd: правда это не в тему Python, но область смежная — Web
    • 0
      Напишите парочку статей, а там сообщество уже оценит.
  • 0
    Спасибо, продолжайте пожалуйста
  • +1
    Очень похоже на Mojolicious (perl), работаю с этим фреймворком какое-то время, про Flask только недавно услышал.
    Сравнивая исходные коды, пока первый кажется понятнее и проще, но может еще просто мало знаком с последним.
  • 0
    app = Flask(__name__)
    
    from app import views


    А объясните мне, пожалуйста, каким образом из объекта Flask делается импорт?
    • 0
      А это не из объекта. Это директория app, в которой автор создал файл вьюшек — app/view.py
      • 0
        почему автор переносит импорт из начала файла в конец?
        • +1
          Чтобы избежать рекурсивных ссылок. Смотрите:
          1) Сначала мы создаем переменную app как объект класса Flask Web Application.
          2) Затем мы импортируем модуль вьюшек из файла app/views.py
          3) В это же время, в модуле вьюшек мы импортируем инстанс нашего веб-приложения app, который мы создали как раз перед импортом модуля вьюшек в init файле. Это необходимо, чтобы обращаться к декорирующим функциям Flask — app.route
  • 0
    В статье линк на virtualenv.py устарел, там больше нет файла по этому линку.
    Не могу установить на маке окружение. Все ставит, но в самом конце выдает ошибку
    microblog/flask/bin/python -c "import sys, pip; sys...d\"] + sys.argv[1:]))" setuptools pip failed with error code 1
    

    гугление ошибки привело сюда.

    Я попробовал разные комбинации с флагом. Ничего не вышло.
    Я пробовал python virtualenv.py --system-site-packages flask
    также прописывал полный путь
    python virtualenv.py --system-site-packages /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/
    или без флага
    python virtualenv.py /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/ flask
    • 0
      $ xcode-select --install
      $ ruby -e "$(curl -fsSL raw.githubusercontent.com/Homebrew/install/master/install)"
      $ export PATH=/usr/local/bin:$PATH
      $ touch ~/.bash_profile

      правим .bash_profile

      if [ -f ~/.bashrc ]; then
      source ~/.bashrc
      fi
      export PATH=/usr/local/share/python:$PATH

      $ brew install python
      $ which python
      /usr/local/bin/python

      $ sudo easy_install pip
      $ sudo pip install virtualenv
      $ pip install virtualenvwrapper
      $ mkdir ~/.virtualenvs

      правим .bashrc

      export WORKON_HOME=~/.virtualenvs
      source /usr/local/bin/virtualenvwrapper.sh

      $source .bash_profile или перезапускаем терминал

      далее
      $ mkvirtualenv test-bottle
      потом, в след раз можно сразу будет
      $ workon test-bottle ( команда умеет tab)
      $ deactivate — выйти из окружения
      $ rmvirtualenv -удалить окружение и так далее

      • 0
        следует добавить, что автор статьи как-то странно создает виртуальное окружение.
        и, в случае нормальной установки virtualenv, запускать питон в скрипте run.py нужно будет не через #!flask/bin/python, а #!/usr/bin/env python
        • 0
          Автор статьи сделал так, что бы запускать скрипт run.py с виртуального окружения которое он создал, не делая source flask/bin/activate, если не сделать source я подозреваю что ваш код будет запрашивать «глобальный» питон, без установленных через pip пакетов
          • 0
            Да, все верно, спасибо.
      • 0
        Я так понимаю это для версии python 3.0? Так как с версией 2.7 я работал без доп. установок на Mac OS X 10.10
        • 0
          Это для любых версий, если вы не хотите устанавливать pip пакеты глобально.
  • 0

    Спасибо автору за перевод — тоже заинтересовал Flask, решил пройти этот туториал на Питоне 3.4.
    Для третьего Питона рекомендуют вместо virtualenv использовать venv и следовательно настраивать виртуальное окружение нужно командой:


    python3 -m venv имя_папки_окружения

    Но у себя я столкнулся с проблемой — почему-то в окружение не захотел переносится pip, потому настраивал окружение следующим образом:


    python3 -m venv --without-pip имя_папки_окружения
    source ~путь/имя_папки_окружения/bin/activate
    curl https://bootstrap.pypa.io/get-pip.py | python
    • 0
      Что-то у вас не так работало. То, что `venv` добавили в поставку это правда. А так — `pip` должен быть сразу.
      • 0

        А я и не говорил Pip-а нету. Он есть, но при выполнении команды venv выдавало ошибку и pip в виртуальное окружение не переносился.
        Дебиан 8.5, Питон 3.4.2.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.