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

Preview:

DESCRIPTION

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

Citation preview

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='test@test.com')

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

pavel.tyslyatsky@gmail.com

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

Recommended