34
Flask как хорошее решение для веб проекта Павел Тысляцкий

Flask как хорошее решение для веб проекта

Embed Size (px)

DESCRIPTION

Flask как хорошее решение для веб проекта Автор: Павел Тысляцкий

Citation preview

Page 1: Flask как хорошее решение для веб проекта

Flask как хорошее решение

для веб проекта

Павел Тысляцкий

Page 2: Flask как хорошее решение для веб проекта

О чем пойдет речь

1. О Flask

2. Немного магии

3. Расширяемость

4. Плагины и примеры

Page 3: Flask как хорошее решение для веб проекта

Flask

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

• простое ядро

• но расширяемое

• много готовых расширений

• и отличная документация

03/34

Page 4: Flask как хорошее решение для веб проекта

Python

Flask 0.10.1:

• python 2.6

• python 2.7

• python 3.3

04/34

Page 5: Flask как хорошее решение для веб проекта

Зависимости

• WSGI инструментарий (werkzeug)

• шаблонный движек (jinja2)

05/34

Page 6: Flask как хорошее решение для веб проекта

Количество кода

Пакет Кол. строк Кол. тестов

bottle 7267 91

cherrypy 33516 224

django 112563 639

flask 10163 231

pyramid 50145 443

web2py 121937 178

06/34

Page 7: Flask как хорошее решение для веб проекта

Что есть из коробки

• Restful роутинг

• Шаблоны и статика

• Сессии и безопасные куки

• Логирование

• Поддержка WSGI middlewares

• Система тестирования и отладки 07/34

Page 8: Flask как хорошее решение для веб проекта

Как можно развернуть

• uWSGI

• FastCGI, CGI

• Gunicorn

• Gevent

• Tornado

• Twisted 08/34

Page 9: Flask как хорошее решение для веб проекта

Немного магии

Магические переменные:

• потокобезопасны

• общедоступны и удобны

• актуальны для контекста

• не скрыты внутри фреймворка

09/34

Page 10: Flask как хорошее решение для веб проекта

Пример магии

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

Page 11: Flask как хорошее решение для веб проекта

Контекст

application context

• доступен

всегда

• current_app

• g

request context

• доступен во

время запроса

• request

• session

• current_user

(Flask-Login)

11/34

Page 12: Flask как хорошее решение для веб проекта

Отсутствие контекста

app = Flask(__name__)

print(current_app)

RuntimeError: working outside of application

context

print(request)

RuntimeError: working outside of request

context 12/34

Page 13: Flask как хорошее решение для веб проекта

Создание контекста

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

Page 14: Flask как хорошее решение для веб проекта

request_context.__enter__

• создает app_context если тот

отсутсвует в _app_ctx_stack

• очищает предыдущий

request_context

• инициализирует request_context

и помещает в _request_ctx_stack 14/34

Page 15: Flask как хорошее решение для веб проекта

request_context.__exit__

• вызывает teardown_request

• очищает request_context

15/34

Page 16: Flask как хорошее решение для веб проекта

*_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

Page 17: Flask как хорошее решение для веб проекта

Расширяемость

• реализация плагинов

• blueprints

• pluggable view (class based view)

• декораторы

• сигналы

17/34

Page 18: Flask как хорошее решение для веб проекта

Создание плагина

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

Page 19: Flask как хорошее решение для веб проекта

Blueprints

• подприложения

• возможно иметь собственные

директории статики и шаблонов

• префикс или поддомен для url

• регистрация с разными url

19/34

Page 20: Flask как хорошее решение для веб проекта

Pluggable View

• сила наследования

• View.dispatch_request

• MethodView.<method>

• view.as_view

20/34

Page 21: Flask как хорошее решение для веб проекта

Декораторы

• before_request

• after_request

• teardown_request

• context_processor

• url_value_preprocessor

• url_defaults 21/34

Page 22: Flask как хорошее решение для веб проекта

Сигналы

• информирование о событии

• логирование

• тестирование

22/34

Page 23: Flask как хорошее решение для веб проекта

Плагины и примеры

• работа с базой и формами

• авторизация и аутентификация

• локализация

• асинхронные задачи

• RESTFUL API

• админка 23/34

Page 24: Flask как хорошее решение для веб проекта

Работа с базой

нет собственной ORM

популярные ORM:

• SQLAlchemy

• Peewee

• Mongoengine

24/34

Page 25: Flask как хорошее решение для веб проекта

Flask-Mongoengine

• ORM для mongodb

• работает WTForms

• поддерживается Flask-Admin

• пагинация

• можно хранить сессии в mongodb

25/34

Page 26: Flask как хорошее решение для веб проекта

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

Page 27: Flask как хорошее решение для веб проекта

Формы

Flask-WTForms

• валидация

• рендеринг

• генерация из модели

class RegForm(model_form(UserModel)):

recatcha = RecaptchaField()

27/34

Page 28: Flask как хорошее решение для веб проекта

Авторизация

Авторизация и аутентификация:

Flask-Login

Авторизация через соц сети:

Flask-OAuth

28/34

Page 29: Flask как хорошее решение для веб проекта

Локализация

Flask-Babel

• локализация и интернализация

• создание файлов переводов

• интеграция с шаблонами

29/34

Page 30: Flask как хорошее решение для веб проекта

Асинхронные задачи

Celery

• медленные операции

• переодические операции

• mongodb

30/34

Page 31: Flask как хорошее решение для веб проекта

REST API

• Flask-RESTless

• Flask-RESTful

o валидация

o обработка ошибок

o преобразование данных

31/34

Page 32: Flask как хорошее решение для веб проекта

Админка

Flask-Admin

• CRUD, фильтрация и поиск

• расширяемость

• Mongoengine

admin = Admin(app)

admin.add_view(ModelView(model=User))

32/34

Page 33: Flask как хорошее решение для веб проекта

Тестирование

Flask-Testing

• тестовый клиент

• контекст запроса

• преопределенные asserts

33/34