Full Stack
Desenvolvendo um CMS com Flask e MongoDB
Application Framework
Who?

Bruno Rocha
@rochacbruno
http://github.com/rochacbruno
http://rochacbruno.com.br
http://pythonhub.com
What?

Content Management System
Sistema de Gerenciamento de Conteúdo é um aplicativo usado para criar, editar,
gerenciar e publicar conteúdo de forma consistentemente organizada. O conteúdo pode
incluir arquivos, imagens, áudios, vídeos, documentos eletrônicos e conteúdo Web.
Podemos dizer que um CMS é semelhante a um framework (um esqueleto) de website préestruturado, com recursos básicos de: usabilidade, visualização e segurança e
administração já prontamente disponíveis.
wikipedia
For

●
●
●
●
●
●
●
●
●
●

Blog
Wiki
Forum
Documentação
Portal
Site institucional
Rede social
Intranet
GED/ECM
…
You ?
1999

2003

2007

2010

2013

2014

Movuca Social CMS

www.web2pyslices.com , www.menuvegano.com.br

www.virgula.com.br, www.jovempan.com.br

demo.quokkaproject.org, www.quokkaproject.org
Why not Plone ?
Produto ou Plataforma?
● Pronto para usar
● Pré definições
● Configuração mínima
● Instalação automatizada
● Boilerplate
● settings via admin
Wordpress, Joomla, Plone,
Django CMS, Mezzanine,
Quokka...

●
●
●
●

Desacoplado
Integrável
Montável
settings via código

SharePoint, Liferay, Pinax,
Opps
Features

●

Organização de conteúdo
○

●

Criação e edição de conteúdo
○

●

RBAC, Multi autores

Indexação e busca
Interação social
○

●
●
●
●
●
●

Formulários, API, crawlers

Controle de acesso e permissões
○

●
●

Canais, Categorias, Tags, Slugs, Redirects

login, comments, share

Recomendação
Versionamento
Multimedia
Extensões/Plugins
Instalação automatizada
Temas!!!
Where it hurts?
●

●
●

●

Flexibilidade
○ Campos customizados
○ Validadores customizados
Esquema de banco de dados
○ Schema migrations
Código único
○ Incluir novas features para sites específicos sem
quebrar o source e a modelagem do banco
Performance
○ Manter a performance sem precisar de engenharia
de denormalização

Relacional
Postgres hstore… maybe...
CMS(Produto)
+ Zope Framework
+ Zodb = NoSQL

Full Stack
Framework

Micro Framework

Baterias incluídas, com
“overhead”. (tem muito mais do
que o necessário e não é fácil
refinar e exige conhecimento de
Zope)

Faz as escolhas por você
ORM, Templates, Organização
de arquivos, organização de
settings.

Mais escolhas = controle
Trabalha bem com NoSQL
Crescimento gradativo
WHY
?
●
●
●
●

Leve
Flexivel (Schema less) = No migrations! :)
JSON (Python {}, JavaScript {})
Aggregation Framework / Pipelines
It is not a framework, it is a pattern!

Good intentions

flask.ext.*
your_app.py
your_app.py
$ pip install flask, flask-security, flask-admin, xpto-orm
from
from
from
from
from

flask import Flask
flask.ext.security import Security
flask.ext.admin import Admin
somewhere.db.models import UserDatastore
somewhere.views import indexpage

def create_app(**config):
app = Flask(“myapp”)
app.config_from_object(config)
Admin(app)
Security(app, UserDatastore)
app.add_url_rule(“/index/<something>”, view_func=indexpage)
return app
if __name__ == “__main__”:
app = create_app(SECRET_KEY=”XYZ”)
app.run()
Blueprints
Um Blueprint funciona de forma similar a um objeto Flask, mas na verdade não
é uma aplicação, mas sim um projeto de como construir ou extender uma
aplicação

from flask import Blueprint, render_template
blog_extension = Blueprint(“my_blog_extension”)
blog_extension.endpoint = “/blog”
blog_extension.templates_folder = “path/to/blog_templates”
blog_extension.static_folder = “path/to/blog_static”
@blog_extension.route(“/index”)
def blog():
return render_template(“blog.html”)
from somewhere import blog_extension
def create_app(**config):
app = Flask(“myapp”)
...
app.register_blueprint(blog_extension)
return app
●

flask.ext.
○ Security
○ Social-login
○ Rest
○ Mail
○ Admin
○ Gravatar
○ Cache
○ SQLAlchemy
○ MongoEngine
○ RiakAlchemy
○ Assets
○ Script
○ Celery
○ Mobile
○ Testing
○ Babel
○ WTForms
○ ...
Flask subclass
○ class MyOwnFlask(Flask)

●

Se eu fosse você eu usaria….

●

application factory
○ app = create_app(**config)
○ evita import circular

●

Blueprints
○ Mesmo que seja uma one-page-app

●

Flask-Admin
○ Modular, insira qualquer view no admin, crud completo, actions, filters

●

Flask-Security
○ Login, Logout, Lembrar senha, Register, Access control, permissions

●

Flask-script
○ python manage.py faça_me_um_sanduiche

●

app.config_from_envvar
○ Settings desacoplado da app
○ export APP_SETTINGS=”/path/to/settings.cfg”
○ app.config_from_envvar(“APP_SETTINGS”)
Dispatcher Middleware
wsgi.py
from werkzeug.wsgi import DispatcherMiddleware
import your_app, another_app, api

application = DispatcherMiddleware(
your_app.create_app(), # vai servir na raiz '/'
{
'/outrosite': another_app.create_app(),
'/api': api.create_app(),
...
}
)
●
●
●
●
●
●
●
●
●
●
●
●

Admin customizavel e extensível
Import/Export
Controle de acesso
Scripts para deploy, teste, execução
Extensível através de módulos
Multi temas
Canais e urls amigavéis
Celery ready!
Rest API
Multimedia management (Gallery, Images)
Configurações flexiveis via admin
MongoDB

Abra uma issue ou mande um pull request em
http://www.quokkaproject.org
CONTENT ADMIN
CONTENT EDITORS (markdown / html)
MEDIA MANAGEMENT
MODULES
Next step: Quokka as a Framework on top of Flask

$ quokka start_project
$ quokka start_module
$ quokka start_theme
$ quokka register theme
$ quokka install theme
$ quokka register module
$ quokka install module
$ quokka deploy --heroku --user….
Thank you!
www.quokkaproject.org

Flask for CMS/App Framework development.

  • 1.
    Full Stack Desenvolvendo umCMS com Flask e MongoDB Application Framework
  • 2.
  • 3.
    What? Content Management System Sistemade Gerenciamento de Conteúdo é um aplicativo usado para criar, editar, gerenciar e publicar conteúdo de forma consistentemente organizada. O conteúdo pode incluir arquivos, imagens, áudios, vídeos, documentos eletrônicos e conteúdo Web. Podemos dizer que um CMS é semelhante a um framework (um esqueleto) de website préestruturado, com recursos básicos de: usabilidade, visualização e segurança e administração já prontamente disponíveis. wikipedia
  • 4.
  • 5.
    You ? 1999 2003 2007 2010 2013 2014 Movuca SocialCMS www.web2pyslices.com , www.menuvegano.com.br www.virgula.com.br, www.jovempan.com.br demo.quokkaproject.org, www.quokkaproject.org
  • 6.
  • 7.
    Produto ou Plataforma? ●Pronto para usar ● Pré definições ● Configuração mínima ● Instalação automatizada ● Boilerplate ● settings via admin Wordpress, Joomla, Plone, Django CMS, Mezzanine, Quokka... ● ● ● ● Desacoplado Integrável Montável settings via código SharePoint, Liferay, Pinax, Opps
  • 8.
    Features ● Organização de conteúdo ○ ● Criaçãoe edição de conteúdo ○ ● RBAC, Multi autores Indexação e busca Interação social ○ ● ● ● ● ● ● Formulários, API, crawlers Controle de acesso e permissões ○ ● ● Canais, Categorias, Tags, Slugs, Redirects login, comments, share Recomendação Versionamento Multimedia Extensões/Plugins Instalação automatizada Temas!!!
  • 9.
    Where it hurts? ● ● ● ● Flexibilidade ○Campos customizados ○ Validadores customizados Esquema de banco de dados ○ Schema migrations Código único ○ Incluir novas features para sites específicos sem quebrar o source e a modelagem do banco Performance ○ Manter a performance sem precisar de engenharia de denormalização Relacional Postgres hstore… maybe...
  • 10.
    CMS(Produto) + Zope Framework +Zodb = NoSQL Full Stack Framework Micro Framework Baterias incluídas, com “overhead”. (tem muito mais do que o necessário e não é fácil refinar e exige conhecimento de Zope) Faz as escolhas por você ORM, Templates, Organização de arquivos, organização de settings. Mais escolhas = controle Trabalha bem com NoSQL Crescimento gradativo
  • 11.
    WHY ? ● ● ● ● Leve Flexivel (Schema less)= No migrations! :) JSON (Python {}, JavaScript {}) Aggregation Framework / Pipelines
  • 12.
    It is nota framework, it is a pattern! Good intentions flask.ext.* your_app.py
  • 13.
    your_app.py $ pip installflask, flask-security, flask-admin, xpto-orm from from from from from flask import Flask flask.ext.security import Security flask.ext.admin import Admin somewhere.db.models import UserDatastore somewhere.views import indexpage def create_app(**config): app = Flask(“myapp”) app.config_from_object(config) Admin(app) Security(app, UserDatastore) app.add_url_rule(“/index/<something>”, view_func=indexpage) return app if __name__ == “__main__”: app = create_app(SECRET_KEY=”XYZ”) app.run()
  • 14.
    Blueprints Um Blueprint funcionade forma similar a um objeto Flask, mas na verdade não é uma aplicação, mas sim um projeto de como construir ou extender uma aplicação from flask import Blueprint, render_template blog_extension = Blueprint(“my_blog_extension”) blog_extension.endpoint = “/blog” blog_extension.templates_folder = “path/to/blog_templates” blog_extension.static_folder = “path/to/blog_static” @blog_extension.route(“/index”) def blog(): return render_template(“blog.html”) from somewhere import blog_extension def create_app(**config): app = Flask(“myapp”) ... app.register_blueprint(blog_extension) return app
  • 15.
    ● flask.ext. ○ Security ○ Social-login ○Rest ○ Mail ○ Admin ○ Gravatar ○ Cache ○ SQLAlchemy ○ MongoEngine ○ RiakAlchemy ○ Assets ○ Script ○ Celery ○ Mobile ○ Testing ○ Babel ○ WTForms ○ ...
  • 16.
    Flask subclass ○ classMyOwnFlask(Flask) ● Se eu fosse você eu usaria…. ● application factory ○ app = create_app(**config) ○ evita import circular ● Blueprints ○ Mesmo que seja uma one-page-app ● Flask-Admin ○ Modular, insira qualquer view no admin, crud completo, actions, filters ● Flask-Security ○ Login, Logout, Lembrar senha, Register, Access control, permissions ● Flask-script ○ python manage.py faça_me_um_sanduiche ● app.config_from_envvar ○ Settings desacoplado da app ○ export APP_SETTINGS=”/path/to/settings.cfg” ○ app.config_from_envvar(“APP_SETTINGS”)
  • 17.
    Dispatcher Middleware wsgi.py from werkzeug.wsgiimport DispatcherMiddleware import your_app, another_app, api application = DispatcherMiddleware( your_app.create_app(), # vai servir na raiz '/' { '/outrosite': another_app.create_app(), '/api': api.create_app(), ... } )
  • 18.
    ● ● ● ● ● ● ● ● ● ● ● ● Admin customizavel eextensível Import/Export Controle de acesso Scripts para deploy, teste, execução Extensível através de módulos Multi temas Canais e urls amigavéis Celery ready! Rest API Multimedia management (Gallery, Images) Configurações flexiveis via admin MongoDB Abra uma issue ou mande um pull request em http://www.quokkaproject.org
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
    Next step: Quokkaas a Framework on top of Flask $ quokka start_project $ quokka start_module $ quokka start_theme $ quokka register theme $ quokka install theme $ quokka register module $ quokka install module $ quokka deploy --heroku --user….
  • 24.