|
1 | | -Title: What the Flask? pt-4 e 5 Como Criar Extensões e Plugins para o Flask |
| 1 | +Title: What the Flask? pt 4 e 5 Criando Extensões para o Flask |
2 | 2 | Slug: what-the-flask-pt-4-5-como-criar-extensoes-e-plugins-para-flask |
3 | | -Date: 2017-05-01 09:00 |
| 3 | +Date: 2017-04-24 09:00 |
4 | 4 | Tags: flask,web,tutorial,what-the-flask |
5 | 5 | Author: Bruno Cezar Rocha |
6 | 6 | Email: rochacbruno@gmail.com |
@@ -31,28 +31,26 @@ What The Flask - 4-5/6 |
31 | 31 | 1. [**Hello Flask**](/what-the-flask-pt-1-introducao-ao-desenvolvimento-web-com-python): Introdução ao desenvolvimento web com Flask |
32 | 32 | 2. [**Flask patterns**](/what-the-flask-pt-2-flask-patterns-boas-praticas-na-estrutura-de-aplicacoes-flask): Estruturando aplicações Flask |
33 | 33 | 3. [**Plug & Use**](/what-the-flask-pt-3-plug-use-extensoes-essenciais-para-iniciar-seu-projeto): extensões essenciais para iniciar seu projeto. |
34 | | -4. [**e 5 Criando Extensões e Plugins para o Flask**](what-the-flask-pt-4-5-como-criar-extensoes-e-plugins-para-flask)(**<-- Você está aqui**) |
| 34 | +4. [**e 5 Criando Extensões para o Flask**](what-the-flask-pt-4-5-como-criar-extensoes-e-plugins-para-flask)(**<-- Você está aqui**) |
35 | 35 | 6. **Run Flask Run**: "deploiando" seu app nos principais web servers e na nuvem. |
36 | 36 |
|
37 | 37 |
|
38 | 38 | Não sei se você ainda se lembra? mas estavámos desenvolvendo um [CMS de notícias](http://github.com/rochacbruno/wtf), |
39 | | -utilizamos MongoDB, Flask-Security, Flask-Admin e Bootstrap. |
40 | | - |
41 | | -Agora vamos nos aprofundar um pouco mais nos detalhes do `Blueprint` e então |
42 | | -criar passo a passo uma extensão (ou se preferir pode chamar de plugin) para o |
43 | | -Flask. |
| 39 | +utilizamos MongoDB, Flask-Security, Flask-Admin e Bootstrap, neste artigo |
| 40 | +iremos adicionar mais uma extensão em nosso CMS, mas iremos criar a extensão |
| 41 | +ao invés de usar uma das extensões disponiveis. |
44 | 42 |
|
45 | 43 | > **Extensão ou Plugin?** Por [definição](https://pt.wikipedia.org/wiki/Plug-in) |
46 | | -`plugin` é a palavra usada para descrever um aplicativo totalmente externo e |
47 | | -desacoplado da lógica do framework, enquanto `extensão` é o termo usado para |
| 44 | +**plugin** é a palavra usada para descrever um aplicativo totalmente externo e |
| 45 | +desacoplado da lógica do framework. Enquanto **extensão** é o termo usado para |
48 | 46 | descrever um módulo que utiliza as mesmas estruturas do framework e que pode opcionalmente ser ativado. |
49 | | -No Flask sempre será mais comum usarmos apenas a palavra `Extension` pois |
50 | | -conforme já mencionado aqui nesta série, o `flask` encoraja a sobrecarga de |
| 47 | +No Flask sempre será mais comum usarmos apenas a palavra **Extension** pois |
| 48 | +conforme já mencionado aqui nesta série, o **flask** encoraja a sobrecarga de |
51 | 49 | seus métodos internos fazendo com que a maioria das extensões injetem |
52 | | -funcionalidades diretamente ou até mesmo alterem o `core` do framework |
| 50 | +funcionalidades diretamente ou até mesmo alterem o **core** do framework |
53 | 51 | e por isso o termo extensão é mais utilizado pela comunidade. |
54 | | -Podemos usar a palavra `plugin` para descrever módulos que sejam escritos para adicionar funcionalidades não ao flask mas sim a camadas de mais alto nível da aplicação e que não seja de uso geral. `Extension` é um módulo que pode ser |
55 | | -reaproveitado por qualquer aplicativo escrito em `flask` enquanto `plugin` é |
| 52 | +Podemos usar a palavra **plugin** para descrever módulos que sejam escritos para adicionar funcionalidades não ao flask mas sim a camadas de mais alto nível da aplicação e que não seja de uso geral. **Extension** é um módulo que pode ser |
| 53 | +reaproveitado por qualquer aplicativo escrito em **flask** enquanto **plugin** é |
56 | 54 | um módulo escrito especificamente para a sua aplicação. |
57 | 55 |
|
58 | 56 | # Quando criar uma extensão? |
@@ -157,20 +155,23 @@ Só para exemplificar veja o seguinte exemplo: |
157 | 155 |
|
158 | 156 | ```python |
159 | 157 | app = Flask(__name__) # criamos a instancia de app |
| 158 | +admin = Admin() # instancia do Flask-Admin ainda não inicializada |
160 | 159 |
|
161 | 160 | do_something(app) # injeta ou altera funcionalidades do app |
162 | | -do_another_thing(app) # injeta ou altera funcionalidades do app |
| 161 | +do_another_thing(app, admin) # injeta ou altera funcionalidades do app ou do admin |
163 | 162 | Security(app) # adiciona funcionalidades de login e controle de acesso |
164 | 163 | Cache(app) # adiciona cache para views e templates |
165 | 164 | Sitemap(app) # A extensão que iremos criar! adiciona o /sitemap.xml no app |
| 165 | + |
| 166 | +admin.init_app(app) # agora sim inicializamos o flask-admin no modo lazy |
166 | 167 | ``` |
167 | 168 |
|
168 | 169 | Olhando o código acima pode parecer bastante simples, você pode achar que basta |
169 | 170 | receber a intância de `app` e sair alterando sem seguir nenhum padrão. |
170 | 171 |
|
171 | 172 | ```python |
172 | 173 | def do_something(app): |
173 | | - "Mal exemplo de factory injeta ou altera funcionalidades do app" |
| 174 | + "Mal exemplo de factory que injeta ou altera funcionalidades do app" |
174 | 175 | # adiciona rotas |
175 | 176 | @app.route('/qualquercoisa) |
176 | 177 | def qualquercoisa(): |
@@ -226,7 +227,36 @@ mas não se preocupe pois usando Blueprint isso já é resolvido automaticamente |
226 | 227 | # Criando a extensão Simple Sitemap |
227 | 228 |
|
228 | 229 | Ok, agora que você já sabe a teoria vamos para a prática, vamos reescrever o |
229 | | -nosso app do **Exemplo 1** usando uma extensão chamada `flask_simple_sitemap` |
| 230 | +nosso app do **Exemplo 1** usando uma extensão chamada `flask_simple_sitemap` e para isso vamos começar criando a extensão: |
| 231 | + |
| 232 | +A extensão será um novo módulo Python que vai ser instalado usando `setup` ou `pip` portanto crie um projeto separado. |
| 233 | + |
| 234 | +```bash |
| 235 | +$ cd Projects # pasta onde vc armazena seus projetos |
| 236 | + |
| 237 | +$ mkdir simple_sitemap # o diretório root do projeto |
| 238 | +$ cd simple_sitemap |
| 239 | +$ touch setup.py # precisaremos instalar a extensão |
| 240 | +$ mkdir templates # usaremos Jinja para gerar o XML |
| 241 | +$ touch sitemap.xml # O template Jinja |
| 242 | +$ echo 'include templates/sitemap.xml' > MANIFEST.in # incluindo templates no build manifest do setuptools |
| 243 | +$ echo '# Prometo documentar essa extensão!' > README.md # é sempre bom incluir uma documentação básica |
| 244 | +$ touch tests.py # se não tiver testes não serve para nada! :) |
| 245 | +$ touch simple_sitemap.py # A Extensão será escrita neste arquivo |
| 246 | +``` |
| 247 | + |
| 248 | +Agora voce terá a seguinte estrutura: |
| 249 | + |
| 250 | +```bash |
| 251 | +simple_sitemap/ |
| 252 | +|__ templates/ |
| 253 | +| |__ sitemap.xml |
| 254 | +|__ simple_sitemap.py |
| 255 | +|__ tests.py |
| 256 | +|__ setup.py |
| 257 | +|__ MANIFEST.in |
| 258 | +|__ README.md |
| 259 | +``` |
230 | 260 |
|
231 | 261 |
|
232 | 262 |
|
|
0 commit comments