cms/ # module root
├── app/ # Application Factory (Flask app será iniciada aqui)
├── cli.py # Ferramenta de linha de comando `cms --help`Factory é um padrão recomendado pela documentação oficial do Flask a idéia é bastante simples e ela ajuda a evitar problemas de circular imports e também melhora a composição do projeto através de extensões.
factory nada mais é do que uma função ou Classe que recebe como primeiro parametro o app e então altera ou adiciona alguma funcionalidade ou configuração durante a fase de configuração do nosso projeto.
Exemplo (abra um python shell ai e faça teste o exemplo abaixo):
def create_object():
"""factory inicial cria o novo objeto"""
obj = {} # neste exemplo é um dicionário vazio
return obj
def factory_add_foo(x):
x['foo'] = 'bar'
def factory_enable_debug(x):
x['DEBUG'] = True
obj = create_object()
factory_add_foo(obj)
factory_enable_debug(obj)
...No final temos um objeto composto pelas funcionalidades das factories
print(obj)
{'foo': 'bar', 'DEBUG': True}Então agora imagine que o obj do exemplo acima é uma app Flask e aplicamos o mesmo conceito compondo a app através de extensões que são functions ou Classes que recebem o app como primeiro argumento.
Agora é sua vez de escrever o app factory em cms/app/__init__.py
from flask import Flask
def create_app():
app = Flask(__name__)
# Faça o que quiser com o `app` aqui:
return appe então no cms/cli.py importe esse factory
import code
import click
from cms.app import create_app
app = create_app()
...A partir daqui já podemos executar alguns comandos:
Um shell com o app Flask para interagirmos, explorarmos e obter ajuda.
$ cms shell
>>> app.config
>>> dir(app)
>>> help(app.route) # digite `q` para sair do help
>>> exit() # para sair do hell
# ou
$ cms runserver --port 5000
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)No entanto se rodarmos o cms adduser teremos mais um erro:
$ cms adduser
Username:
Password:
Repeat password:
...
AttributeError: 'Flask' object has no attribute 'db'
Ainda precisamos terminar de configurar o app e adicionar a conexão com um banco de
dados. (falarei mais dos detalhes a respeito em breve)
Mas antes vamos agora criar o config factory