flask как хорошее решение для веб проекта
DESCRIPTION
Flask как хорошее решение для веб проекта Автор: Павел ТысляцкийTRANSCRIPT
Flask как хорошее решение
для веб проекта
Павел Тысляцкий
О чем пойдет речь
1. О Flask
2. Немного магии
3. Расширяемость
4. Плагины и примеры
Flask
• микрофреймворк
• простое ядро
• но расширяемое
• много готовых расширений
• и отличная документация
03/34
Python
Flask 0.10.1:
• python 2.6
• python 2.7
• python 3.3
04/34
Зависимости
• WSGI инструментарий (werkzeug)
• шаблонный движек (jinja2)
05/34
Количество кода
Пакет Кол. строк Кол. тестов
bottle 7267 91
cherrypy 33516 224
django 112563 639
flask 10163 231
pyramid 50145 443
web2py 121937 178
06/34
Что есть из коробки
• Restful роутинг
• Шаблоны и статика
• Сессии и безопасные куки
• Логирование
• Поддержка WSGI middlewares
• Система тестирования и отладки 07/34
Как можно развернуть
• uWSGI
• FastCGI, CGI
• Gunicorn
• Gevent
• Tornado
• Twisted 08/34
Немного магии
Магические переменные:
• потокобезопасны
• общедоступны и удобны
• актуальны для контекста
• не скрыты внутри фреймворка
09/34
Пример магии
from flask import (current_app,
request, session)
def api_login():
data = request.get_json()
user = current_app.db.get_user(
data['login'], data['pass'])
session['user'] = user.id
return jsonify({'status': 'ok'}) 10/34
Контекст
application context
• доступен
всегда
• current_app
• g
request context
• доступен во
время запроса
• request
• session
• current_user
(Flask-Login)
11/34
Отсутствие контекста
app = Flask(__name__)
print(current_app)
RuntimeError: working outside of application
context
print(request)
RuntimeError: working outside of request
context 12/34
Создание контекста
with app.app_context():
print(current_app)
<flask.app.Flask object at 0x3d0ee10>
with app.test_request_context():
print(request)
<Request 'http://localhost/' [GET]> 13/34
request_context.__enter__
• создает app_context если тот
отсутсвует в _app_ctx_stack
• очищает предыдущий
request_context
• инициализирует request_context
и помещает в _request_ctx_stack 14/34
request_context.__exit__
• вызывает teardown_request
• очищает request_context
15/34
*_ctx_stack
_app_ctx_stack = LocalStack()
_request_ctx_stack = LocalStack()
{thread.get_ident(): []}
current_app - LocalProxy для _app_ctx_stack.app
request - LocalProxy для _request_ctx_stack.top.request 16/34
Расширяемость
• реализация плагинов
• blueprints
• pluggable view (class based view)
• декораторы
• сигналы
17/34
Создание плагина
class Foo(object):
def __init__(app=None):
if app is not None:
self.init_app(app)
def init_app(self, app):
app.extensions['foo'] = self
self.app = app
18/34
Blueprints
• подприложения
• возможно иметь собственные
директории статики и шаблонов
• префикс или поддомен для url
• регистрация с разными url
19/34
Pluggable View
• сила наследования
• View.dispatch_request
• MethodView.<method>
• view.as_view
20/34
Декораторы
• before_request
• after_request
• teardown_request
• context_processor
• url_value_preprocessor
• url_defaults 21/34
Сигналы
• информирование о событии
• логирование
• тестирование
22/34
Плагины и примеры
• работа с базой и формами
• авторизация и аутентификация
• локализация
• асинхронные задачи
• RESTFUL API
• админка 23/34
Работа с базой
нет собственной ORM
популярные ORM:
• SQLAlchemy
• Peewee
• Mongoengine
24/34
Flask-Mongoengine
• ORM для mongodb
• работает WTForms
• поддерживается Flask-Admin
• пагинация
• можно хранить сессии в mongodb
25/34
app = Flask(__name__)
db = MongoEngine(app) class User(Document): email = StringField(unique=True,
max_length=64)
user = User(email='[email protected]')
user.save()
Flask-Mongoengine
26/34
Формы
Flask-WTForms
• валидация
• рендеринг
• генерация из модели
class RegForm(model_form(UserModel)):
recatcha = RecaptchaField()
27/34
Авторизация
Авторизация и аутентификация:
Flask-Login
Авторизация через соц сети:
Flask-OAuth
28/34
Локализация
Flask-Babel
• локализация и интернализация
• создание файлов переводов
• интеграция с шаблонами
29/34
Асинхронные задачи
Celery
• медленные операции
• переодические операции
• mongodb
30/34
REST API
• Flask-RESTless
• Flask-RESTful
o валидация
o обработка ошибок
o преобразование данных
31/34
Админка
Flask-Admin
• CRUD, фильтрация и поиск
• расширяемость
• Mongoengine
admin = Admin(app)
admin.add_view(ModelView(model=User))
32/34
Тестирование
Flask-Testing
• тестовый клиент
• контекст запроса
• преопределенные asserts
33/34
Вопросы?
https://github.com/mitsuhiko/flask
Павел Тысляцкий