flask full stack - desenvolvendo um cms com flask e mongodb
DESCRIPTION
Utilizar Flask + extensões para desenvolver uma plataforma full-stack com os recursos de auth, controle de acesso, assets, commands, celery tasks, interface admin customizavel, cache entre outras coisas. Falarei sobre minha experiência desenvolvendo o Quokka CMS http://www.quokkaproject.org que é um CMS desenvolvido com Flask e Mongo DB.TRANSCRIPT
Desenvolvendo um CMS com Flask e MongoDB
Full Stack
Bruno Rocha@rochacbrunohttp://github.com/rochacbrunohttp://rochacbruno.com.brhttp://pythonhub.com
CADEMY
Who?
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
What?
● Blog● Wiki● Forum● Documentação● Portal● Site institucional● Rede social● Intranet● GED/ECM● …
For
You ?
Movuca Social CMS
1999
2003
2007
2010
2013
2014
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 adminWordpress, 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○ Canais, Categorias, Tags, Slugs, Redirects
● Criação e edição de conteúdo○ Formulários, API, crawlers
● Controle de acesso e permissões○ RBAC, Multi autores
● Indexação e busca● Interação social
○ 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 StackFramework 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 = controleTrabalha bem com NoSQL
Crescimento gradativo
WHY
?
● Leve● Flexivel (Schema less) = No migrations! :)● JSON (Python {}, JavaScript {})
It is not a framework, it is a pattern!
Good intentions
your_app.py
flask.ext.*
from flask import Flaskfrom flask.ext.security import Securityfrom flask.ext.admin import Adminfrom somewhere.db.models import UserDatastorefrom 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()
your_app.py
$ pip install flask, flask-security, flask-admin, xpto-orm
BlueprintsUm 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 somewhere import blog_extension
def create_app(**config): app = Flask(“myapp”) ... app.register_blueprint(blog_extension) return app
from flask import Blueprint, render_templateblog_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”)
● flask.ext.○ Security○ Social-login○ Rest○ Mail○ Admin○ Gravatar○ Cache○ SQLAlchemy○ MongoEngine○ RiakAlchemy○ Assets○ Script○ Celery○ Mobile○ Testing○ Babel○ WTForms○ ...
Se e
u fo
sse
você
eu
usar
ia…
.
● Flask subclass○ class MyOwnFlask(Flask)
● 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
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(),
...
}
)
wsgi.py
● 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
Thank you!www.quokkaproject.org