Code Monkey home page Code Monkey logo

talkshow's Introduction

talkshow

Build Status codecov Language grade: Python

A Call 4 Papers System - A simple base app as example of Flask Architecture

Este é o material do tutorial da Flask Conf 2018 - O evento ocorreu no dia 24/08/2018 - com Patrocinio da SciELO

Apostila

A Apostila em PDF contém a explicação detalhada dos arquivos deste repositório, é recomendado acompanhar a apostila enquanto desenvolve o projeto e utilizar este repositório apenas como referencia para copy/paste.

Apostila: https://github.com/rochacbruno/talkshow/blob/master/TutorialFlaskConf2018_BrunoRocha.pdf

Código para acompanhar a apostila está na branch master https://github.com/rochacbruno/talkshow/tree/master

IMPORTANTE: Alterações e evoluções nesta aplicações serão feitas apenas nesta branch extended a branch master se manterá em sincronia com a apostila.

TL:DR;

Não quer acompanhar a apostila e apenas ver o código em execução?

git clone https://github.com/rochacbruno/talkshow.git
cd talkshow
git checkout extended
python3.6 -m venv venv
source venv/bin/activate
pip install -e '.[dev]'

#comandos
flask adduser -u admin -p 1234
flask addevent -n "Flask Conf" -d "2018-08-25"
flask routes
flask run

Acesse: http://localhost:5000 para ver os eventos cadastrados e submeter propostas

Admin em http://localhost:5000/admin user:admin pass:1234

API em http://localhost:5000/apidocs/

URLS e APIS:

$ flask routes
Endpoint                   Methods    Rule
-------------------------  ---------  -----------------------------------------
admin.index                GET        /admin/
admin.static               GET        /admin/static/<path:filename>
bootstrap.static           GET        /static/bootstrap/<path:filename>
flasgger.<lambda>          GET        /apidocs/index.html
flasgger.apidocs           GET        /apidocs/
flasgger.apispec_1         GET        /apispec_1.json
flasgger.static            GET        /flasgger_static/<path:filename>
proposalview.action_view   POST       /admin/proposalview/action/
proposalview.ajax_lookup   GET        /admin/proposalview/ajax/lookup/
proposalview.ajax_update   POST       /admin/proposalview/ajax/update/
proposalview.create_view   GET, POST  /admin/proposalview/new/
proposalview.delete_view   POST       /admin/proposalview/delete/
proposalview.details_view  GET        /admin/proposalview/details/
proposalview.edit_view     GET, POST  /admin/proposalview/edit/
proposalview.export        GET        /admin/proposalview/export/<export_type>/
proposalview.index_view    GET        /admin/proposalview/
restapi.event              GET, POST  /api/v1/event/
restapi.eventitem          GET, POST  /api/v1/event/<event_id>
simplelogin.login          GET, POST  /login/
simplelogin.logout         GET        /logout/
static                     GET        /static/<path:filename>
webui.event                GET, POST  /<slug>/
webui.index                GET        /

Contribuições são bem vindas na branch extended

talkshow's People

Contributors

neiesc avatar riverfount avatar rochacbruno avatar tiagovizoto avatar viniciusfk9 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

talkshow's Issues

Gerar dinâmicamente os validadores e definições para todas as 3 interfaces

Atualmente temos definição de campos e validadores em 5 locais

  • cli (argumentos dos comandos)
  • UI (formulário wtforms)
  • Admin (Formulario wtform do admin)
  • API (reqparse do Flask_Restful)
  • Apidocs (YAML do flasgger)

Precisamos criar em um local base /definitions.py uma classe Python usando descriptor ou algo do tipo que seja capaz de a partir de um unico modelo gerar specs para esses 5 locais. ex: @definition.generate_cli_specs() para ser usado ao inves de @click.option no cli e um equivalente para os outros locais.

Essa solução pode se transformar em uma library de uso geral externa.

Carregar ext e blueprints dinamicamente

No create_app os ext e os blueprints estão carregando declarativamente.
https://github.com/rochacbruno/talkshow/blob/master/talkshow/app.py#L18

Trocar por um carregamento dinâmico usando werkzeug.utils.import_string

ex:

No settings.toml ou no .env depois de implementar o #1

[default]
EXTENSIONS = ["talkshow.ext.cli", "talkshow.ext.admin"]
BLUEPRINTS = ["talkshow.blueprints.webui", "talkshow.blueprints.restapi"]

Criar ext/extensions.py

from werkzeug.utils import import_string

def configure(app):
    for ext in app.config.get('EXTENSIONS'):
        mod = import_string(ext)
        mod.configure(app)
    
     # fazer o mesmo para os blueprints...

No factory app.py

from talkshow.ext import configuration, extensions

def create_app():
    app = Flask(__name__)
    configuration.configure(app)  # config loaded here
    extensions.configure(app)
    return app
....

Modularizar blueprints

O projeto tem 2 blueprints que são arquivos restapi.py e webui.py transformar em modulos/pastas e separar forms.py, models.py, views.py etc...

Adicionar Dynaconf

Usar Dynaconf para carregar as configurações a partir dos arquivos .env ou settings.toml

IMPORTANTE: qualquer melhoria será aplicada somente a branch extended

Criar versão com SQLAlchemy

Após a maioria das issues de estrutura serem resolvidas a idéia é criar uma versão do mesmo app utilizando SQLAlchemy + SQLite. em uma nova branch.

Usando extensão `pytest` errada

Notei que por motivos de nome parecido, acabei usando a extensão flask-pytest ao invés da pytest-flask

A que está sendo usada flask-pytest na verdade é um test runner em background, é interessante mas não nesse projeto.

A que precisamos usar é a pytest-flask pois essa sim entrega as fixtures necessárias para os testes.

  • mudar no setup.py para usar pytest-flask
  • alterar os testes para receber a fixture client ao inves de usar with app.test_client

Habilitar JWT

Trocar Basic Auth por JWT nas endpoints da API

*manter basic auth apenas para gerar o token

Travis CI

HAbilitar travis CI, criar .travis.yml e configurar para rodar os testes

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.