Flask Command Line Interface
Tags: python, flask, productivity, programming
Published: 2020-12-31 14:55:48

Nesse artigo, iremos explorar o CLI do micro-framework flask. Para quem não conhece, o flask é um framework web, está para o python assim como o express está para o node.

<b>Entendendo o CLI...</b>
- Ao instalar do Flask, automaticamente, será instalado uma interface de linha de comando <i>Click</i>, em seu virtualenv (ambiente virtual);
- Click é um pacote feito para criar comandos personalizados para sua aplicação Flask escrevendo o minimo possivel.

Semelhante aos comandos que o framework django possui para criar super-usuarios, criar apps, etc. o Click possibilita fazermos isso e o melhor é que podemos ir além e criar nossos proprios comandos, agilizando o desenvolvimento de nossos projetos.


# Dependencias

- Virtualenv
- Flask

<b>OBS:</b> <i>Irei partir da premissa de que você ja esta familiarizado com a configuração do ambiente e instalação das dependencias.</i>

Sua estrutura de pastas deve ficar parecida com a minha:

![pastas](https://dev-to-uploads.s3.amazonaws.com/i/8ef9y9n0jlywzpqpng5t.png) 

Dentro do arquivo <i>__ init __.py</i> escreva o codigo da seguinte forma:

```python

# flask imports
from flask import Flask


def create_app():
    '''
        Função para criar um aplicativo Flask
    '''

    # Instanciando a o objeto Flask()
    app = Flask(__name__)

    # retornando o objeto app
    return app

```
 
Agora, dentro do arquivo <i>settings.py</i> iremos criar o nosso comando. O mesmo será responsável por criar apps em nossa aplicação, sem precisarmos criar arquivo por arquivo.

<b>Contextualizando...</b>

Como flask é um micro-framework, o mesmo vem apenas com o basico para criarmos uma aplicação web, dessa forma, não temos tantas ferramentas prontas, como o django, por exemplo. No django, ao executarmos o comando <i>django-admin startapp <nome_da_app></i> criamos uma app dentro do diretorio em que você esta, contendo dentro dessa app os arquivos necessários para que possamos trabalhar, agilizando o processo de criação de nossa aplicação.

Dito isso, iremos fazer algo parecido para nossa aplicação flask, sem muita complexidade e de forma intuitiva, para que vocês possam ver como funciona o CLI do Flask.

Dessa forma, dentro do arquivo <i>settings.py</i>, iremos inserir o seguinte codigo:

```python
# python imports
import os
import subprocess

# flask imports
import click
from flask import request, Blueprint


# Registrando blueprint
bp_settings = Blueprint('settings', __name__)

@bp_settings.cli.command("startapp")
@click.argument("name")
def create_folder_app(name):
    '''
        Essa função cria uma app dentro
        do projeto, ja com os arquivos
        necessarios para trabalhar.

        Exemplo: flask startapp <nome_da_app>

        Dentro da pasta contém os arquivos: 
            - '__init__.py' -> arquivo __init__.py 
            dentro de um subdiretório será sempre o 
            primeiro a ser executado quando um módulo 
            dentro deste subdiretório for chamado;

            - 'views.py' -> arquivo responsavel por
            conter a logica de cada app;

            - 'models.py' -> arquivo que contém uma classe
            que abstrai em modelo uma tabela do banco de dados;

            - 'forms.py' -> arquivo que pode ser usado
            para abstrair os forms HTML, utilizando a 
            lib Flask-WTForms.

        Foi utilizado a função click do 
        flask, responsável por criar
        comandos e argumentos para a 
        aplicação.
    '''

    # Atribuindo o argumento recebido
    # na variavel "name"
    name=name

    try:
        # Acessando a pasta 'app'
        here = os.path.dirname(os.path.dirname(__file__))
        
        # Setando o caminho e o nome
        # dos arquivos que serão criados
        filepath_init = os.path.join(here, f'{name}', '__init__.py')
        filepath_views = os.path.join(here, f'{name}', 'views.py')
        filepath_models = os.path.join(here, f'{name}', 'models.py')
        filepath_forms = os.path.join(here, f'{name}', 'forms.py')

        # Criando pasta
        os.mkdir(os.path.join(here, f'{name}'))
        try:
            # Criando os arquivos
            f = open(filepath_init, 'w')
            f = open(filepath_views, 'w')
            f = open(filepath_models, 'w')
            f = open(filepath_forms, 'w')

            print('App criada com sucesso')
        except IOError as e:
            print(e)
    except IsADirectoryError as e:
        print(e)
 
```

Resumidamente, o codigo acima cria uma app dentro da pasta app do projeto, contendo os arquivos comumente usados, sendo eles, <i>__ init __.py</i>, <i>views.py</i>, <i>models.py</i>, <i>forms.py</i>.

Agora, vamos voltar para nosso arquivo <i>__ init __.py</i> e adicionar o seguinte trecho de código:

```python

 # flask custom commands
 with app.app_context():
     from .settings import create_folder_app
     app.cli.add_command(create_folder_app)

```

O arquivo <i>__ init __.py</i> completo ficará assim:

```python

# flask imports
from flask import Flask


def create_app():
    '''
        Função para criar um aplicativo Flask
    '''

    # Instanciando a o objeto Flask()
    app = Flask(__name__)

    # flask custom commands
    with app.app_context():
        from .settings import create_folder_app
        app.cli.add_command(create_folder_app)

    # retornando o objeto app
    return app

```

Agora, vamos exportar nossas variaveis de ambiente, para que a aplicação flask funcione corretamente. Siga os passos:

- Em seu terminal, dentro da pasta <b>projeto</b>, digite consecutivamente:

```sh
export FLASK_APP=project
export FLASK_ENV=Development
export FLASK_DEBUG=True
```
Feito isso, ja podemos executar o seguinte comando no terminal, para, de fato, utilizarmos nosso comando:

```sh
flask startapp projeto/usuarios 
```

O comando acima irá criar nossa app dentro da pasta projeto.

Após executar o mesmo, a seguinte ordenação de pasta será criada:

![pastas2](https://dev-to-uploads.s3.amazonaws.com/i/663q21c8liahgcrpcplo.png)
 
Pronto, agora ja conseguimos agilizar um de nossos procedimentos diarios no desenvolvimento de uma aplicação flask.

# Considerações finais

O intuito desse artigo foi mostrar a liberdade que temos com o flask e o quanto o mesmo é expansível a modo de facilitar a nossa vida no dia a dia.