Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Flask Full Stack - Desenvolvendo um CMS com Flask e MongoDB

Flask Full Stack - Desenvolvendo um CMS com Flask e MongoDB

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.

Bruno Rocha

October 31, 2013
Tweet

More Decks by Bruno Rocha

Other Decks in Programming

Transcript

  1. Desenvolvendo um CMS com Flask e MongoDB
    Full Stack

    View Slide

  2. Bruno Rocha
    @rochacbruno
    http://github.com/rochacbruno
    http://rochacbruno.com.br
    http://pythonhub.com
    CADEMY
    Who?

    View Slide

  3. 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?

    View Slide

  4. ● Blog
    ● Wiki
    ● Forum
    ● Documentação
    ● Portal
    ● Site institucional
    ● Rede social
    ● Intranet
    ● GED/ECM
    ● …
    For

    View Slide

  5. 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

    View Slide

  6. Why not Plone ?

    View Slide

  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

    View Slide

  8. 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!!!

    View Slide

  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...

    View Slide

  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

    View Slide

  11. WHY
    ?
    ● Leve
    ● Flexivel (Schema less) = No migrations! :)
    ● JSON (Python {}, JavaScript {})

    View Slide

  12. It is not a framework, it is a pattern!
    Good intentions
    your_app.py
    flask.ext.*

    View Slide

  13. from flask import Flask
    from flask.ext.security import Security
    from flask.ext.admin import Admin
    from somewhere.db.models import UserDatastore
    from 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/”, 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

    View Slide

  14. 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 somewhere import blog_extension
    def create_app(**config):
    app = Flask(“myapp”)
    ...
    app.register_blueprint(blog_extension)
    return app
    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”)

    View Slide

  15. ● flask.ext.
    ○ Security
    ○ Social-login
    ○ Rest
    ○ Mail
    ○ Admin
    ○ Gravatar
    ○ Cache
    ○ SQLAlchemy
    ○ MongoEngine
    ○ RiakAlchemy
    ○ Assets
    ○ Script
    ○ Celery
    ○ Mobile
    ○ Testing
    ○ Babel
    ○ WTForms
    ○ ...

    View Slide

  16. Se eu fosse você eu usaria….
    ● 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”)

    View Slide

  17. 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

    View Slide

  18. ● 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

    View Slide

  19. Thank you!
    www.quokkaproject.org

    View Slide