<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: William de Paula</title>
    <description>The latest articles on DEV Community by William de Paula (@williamdepaula).</description>
    <link>https://dev.to/williamdepaula</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F392867%2F328a7543-d8ac-4305-b8a7-de4b2a5331a6.jpg</url>
      <title>DEV Community: William de Paula</title>
      <link>https://dev.to/williamdepaula</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/williamdepaula"/>
    <language>en</language>
    <item>
      <title>Dica Rápida: Removendo node modules para liberar espaço</title>
      <dc:creator>William de Paula</dc:creator>
      <pubDate>Tue, 08 Sep 2020 15:39:40 +0000</pubDate>
      <link>https://dev.to/williamdepaula/dica-rapida-removendo-node-modules-para-liberar-espaco-1mm6</link>
      <guid>https://dev.to/williamdepaula/dica-rapida-removendo-node-modules-para-liberar-espaco-1mm6</guid>
      <description>&lt;p&gt;Conforme vamos desenvolvendo projetos e estudos, os módulos node que usamos vão se acumulando e ocupando espaço no sistema, uma forma fácil de excluir é utilizando o pacote npkill.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aOmCnRqg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/bdit1da0t0zzap8ucrvs.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aOmCnRqg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/bdit1da0t0zzap8ucrvs.gif" alt="Alt Text" width="662" height="373"&gt;&lt;/a&gt;&lt;br&gt;
O npkill faz uma busca no seu ambiente em busca das pastas &lt;code&gt;node_modules&lt;/code&gt; listando elas para você e permitindo que sejam facilmente excluídas.&lt;br&gt;
Para usar é só rodar o comando abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;npx npkill
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Seleciona as pastas que deseja e seja feliz ^_^&lt;/p&gt;

</description>
      <category>node</category>
      <category>npm</category>
    </item>
    <item>
      <title>Componente Input de Busca</title>
      <dc:creator>William de Paula</dc:creator>
      <pubDate>Mon, 13 Jul 2020 14:18:35 +0000</pubDate>
      <link>https://dev.to/williamdepaula/componente-input-de-busca-2dn1</link>
      <guid>https://dev.to/williamdepaula/componente-input-de-busca-2dn1</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WBMl0cj8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3n20z46tcveg1h4edgq3.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WBMl0cj8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3n20z46tcveg1h4edgq3.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
Estudos de implementação de um simples input de busca na forma de um componente VueJs.&lt;br&gt;
Link do repositorio &lt;a href="https://github.com/williamdepaula/componentes-vue"&gt;https://github.com/williamdepaula/componentes-vue&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Tutorial: Gerador de imagens placeholder</title>
      <dc:creator>William de Paula</dc:creator>
      <pubDate>Fri, 22 May 2020 13:51:22 +0000</pubDate>
      <link>https://dev.to/williamdepaula/tutorial-gerador-de-imagens-placeholder-1ie7</link>
      <guid>https://dev.to/williamdepaula/tutorial-gerador-de-imagens-placeholder-1ie7</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Criei um pequeno projeto para estudos de python e do microframework flask para aprendizagem pessoal, como forma de documentar acabei criando um tutorial passo a passo do que fiz, então resolvi compartilhar com mais pessoas.&lt;/p&gt;

&lt;p&gt;Vamos criar um simples projeto de geração de &lt;a href="https://en.wikipedia.org/wiki/Wikipedia:Image_placeholders"&gt;placeholder(espaço reservado) de imagens&lt;/a&gt; utilizando o microframework &lt;a href="https://palletsprojects.com/p/flask/"&gt;Flask&lt;/a&gt; para &lt;a href="https://www.python.org/"&gt;Python&lt;/a&gt; como backend junto com a biblioteca &lt;a href="https://pypi.org/project/Pillow/"&gt;Pillow&lt;/a&gt; para gerar as imagens. &lt;br&gt;
Com isso quero mostrar como é fácil criar aplicações web incríveis utilizando python com flask.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UAXlhlM4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://res.cloudinary.com/dx8wckjaf/image/upload/v1590154963/tutoriais/gerador-de-imagens-placeholder/Capa_izy8yg.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UAXlhlM4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://res.cloudinary.com/dx8wckjaf/image/upload/v1590154963/tutoriais/gerador-de-imagens-placeholder/Capa_izy8yg.gif" alt="Placeholder" width="880" height="580"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Sumario
&lt;/h2&gt;





&lt;ul&gt;
&lt;li&gt;
Tutorial: Gerador de imagens placeholder

&lt;ul&gt;
&lt;li&gt;Introdução&lt;/li&gt;
&lt;li&gt;Sumario&lt;/li&gt;
&lt;li&gt;Repositório&lt;/li&gt;
&lt;li&gt;Pré-requisitos&lt;/li&gt;
&lt;li&gt;Preparando o ambiente&lt;/li&gt;
&lt;li&gt;Instalando dependências&lt;/li&gt;
&lt;li&gt;Criando o requirements.txt&lt;/li&gt;
&lt;li&gt;Hello World com Flask&lt;/li&gt;
&lt;li&gt;Planejando nossa aplicação&lt;/li&gt;
&lt;li&gt;Lista de URLs&lt;/li&gt;
&lt;li&gt;Pagina Inicial&lt;/li&gt;
&lt;li&gt;Exibindo a index.html&lt;/li&gt;
&lt;li&gt;Gerando imagens quadradas&lt;/li&gt;
&lt;li&gt;Gerando imagens retangulares&lt;/li&gt;
&lt;li&gt;Conclusão&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Repositório
&lt;/h2&gt;

&lt;p&gt;O projeto final está disponível no &lt;a href="https://github.com/williamdepaula/gerador-de-imagens-placeholder"&gt;meu github&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Pré-requisitos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.6 ou superior&lt;/li&gt;
&lt;li&gt;IDE (Ambiente de Desenvolvimento Integrado) de sua preferência, recomendo o &lt;a href="https://code.visualstudio.com/"&gt;VSCode&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Preparando o ambiente
&lt;/h2&gt;

&lt;p&gt;Sempre que for criar um novo projeto python crie um &lt;a href="https://virtualenv.pypa.io/en/latest/"&gt;virtualenv&lt;/a&gt; para garantir que seus projetos e bibliotecas utilizadas fiquem isoladas do sistema base em que está rodando, garantindo maior portabilidade.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ mkdir placeholder-generator
$ cd placeholder-generator
$ python -m venv env
$ source env/bin/activate
(env) william@william-Note:~/Flask/placeholder-generator
$ code .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Basicamente nos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Linha 1:&lt;/strong&gt; criamos uma pasta para o nosso projeto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linha 2:&lt;/strong&gt; acessamos está pasta.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linha 3:&lt;/strong&gt; criamos o virtualenv.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linha 4:&lt;/strong&gt; ativamos este virtualenv.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linha 6:&lt;/strong&gt; abrimos o vscode dentro da pasta do nosso projeto.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Instalando dependências
&lt;/h2&gt;

&lt;p&gt;Vamos instalar o Flask e a biblioteca de imagens Pillow, lembre-se de estar com o virtualenv ativado.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ pip install Flask Pillow
Collecting Flask
  Using cached https://files.pythonhosted.org/packages/f2/28/2a03252dfb9ebf377f40fba6a7841b47083260bf8bd8e737b0c6952df83f/Flask-1.1.2-py2.py3-none-any.whl
Collecting Pillow
  Downloading https://files.pythonhosted.org/packages/ab/f8/d3627cc230270a6a4eedee32974fbc8cb26c5fdb8710dd5ea70133640022/Pillow-7.1.2-cp37-cp37m-manylinux1_x86_64.whl (2.1MB)
    100% |████████████████████████████████| 2.1MB 3.5MB/s 
Collecting itsdangerous&amp;gt;=0.24 (from Flask)
  Using cached https://files.pythonhosted.org/packages/76/ae/44b03b253d6fade317f32c24d100b3b35c2239807046a4c953c7b89fa49e/itsdangerous-1.1.0-py2.py3-none-any.whl
Collecting Werkzeug&amp;gt;=0.15 (from Flask)
  Using cached https://files.pythonhosted.org/packages/cc/94/5f7079a0e00bd6863ef8f1da638721e9da21e5bacee597595b318f71d62e/Werkzeug-1.0.1-py2.py3-none-any.whl
Collecting click&amp;gt;=5.1 (from Flask)
  Using cached https://files.pythonhosted.org/packages/d2/3d/fa76db83bf75c4f8d338c2fd15c8d33fdd7ad23a9b5e57eb6c5de26b430e/click-7.1.2-py2.py3-none-any.whl
Collecting Jinja2&amp;gt;=2.10.1 (from Flask)
  Using cached https://files.pythonhosted.org/packages/30/9e/f663a2aa66a09d838042ae1a2c5659828bb9b41ea3a6efa20a20fd92b121/Jinja2-2.11.2-py2.py3-none-any.whl
Collecting MarkupSafe&amp;gt;=0.23 (from Jinja2&amp;gt;=2.10.1-&amp;gt;Flask)
  Using cached https://files.pythonhosted.org/packages/98/7b/ff284bd8c80654e471b769062a9b43cc5d03e7a615048d96f4619df8d420/MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl
Installing collected packages: itsdangerous, Werkzeug, click, MarkupSafe, Jinja2, Flask, Pillow
Successfully installed Flask-1.1.2 Jinja2-2.11.2 MarkupSafe-1.1.1 Pillow-7.1.2 Werkzeug-1.0.1 click-7.1.2 itsdangerous-1.1.0
You are using pip version 10.0.1, however version 20.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Criando o requirements.txt
&lt;/h3&gt;

&lt;p&gt;Uma boa pratica quando se cria projeto python é criar um &lt;a href="https://pip.pypa.io/en/latest/user_guide/#requirements-files"&gt;requirements.tx&lt;/a&gt; com todos os arquivos e dependências do projeto.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;pip freeze &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quando quiser instalar basta digitar o comando &lt;code&gt;pip install -r requirements.txt&lt;/code&gt; para ter um ambiente instalado e pronto rapidamente. &lt;/p&gt;

&lt;h2&gt;
  
  
  Hello World com Flask
&lt;/h2&gt;

&lt;p&gt;Vamos criar nosso primeiro programa utilizando o flask e python. Crie um arquivo com o nome&lt;br&gt;
&lt;strong&gt;main.py&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from flask import Flask

app = Flask(__name__)

@app.route("/")
def index():
    return "Hello World!"

if __name__ == "__main__":
    app.run(port=8000, debug=True)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para rodar nosso programa abra o termina, com o &lt;code&gt;virtualenv&lt;/code&gt; ativado execute.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;python main.py 
 &lt;span class="k"&gt;*&lt;/span&gt; Serving Flask app &lt;span class="s2"&gt;"main"&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;lazy loading&lt;span class="o"&gt;)&lt;/span&gt;
 &lt;span class="k"&gt;*&lt;/span&gt; Environment: production
   WARNING: This is a development server. Do not use it &lt;span class="k"&gt;in &lt;/span&gt;a production deployment.
   Use a production WSGI server instead.
 &lt;span class="k"&gt;*&lt;/span&gt; Debug mode: on
 &lt;span class="k"&gt;*&lt;/span&gt; Running on http://127.0.0.1:8000/ &lt;span class="o"&gt;(&lt;/span&gt;Press CTRL+C to quit&lt;span class="o"&gt;)&lt;/span&gt;
 &lt;span class="k"&gt;*&lt;/span&gt; Restarting with &lt;span class="nb"&gt;stat&lt;/span&gt;
 &lt;span class="k"&gt;*&lt;/span&gt; Debugger is active!
 &lt;span class="k"&gt;*&lt;/span&gt; Debugger PIN: 356-909-478
127.0.0.1 - - &lt;span class="o"&gt;[&lt;/span&gt;17/May/2020 18:33:28] &lt;span class="s2"&gt;"GET / HTTP/1.1"&lt;/span&gt; 200 -
127.0.0.1 - - &lt;span class="o"&gt;[&lt;/span&gt;17/May/2020 18:33:28] &lt;span class="s2"&gt;"GET /favicon.ico HTTP/1.1"&lt;/span&gt; 404 -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Abra o seu navegador na página &lt;a href="http://localhost:8000/"&gt;http://localhost:8000/&lt;/a&gt; para ver seu primeiro programa funcionar.&lt;/p&gt;

&lt;p&gt;Vamos as explicações:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Linha 1:&lt;/strong&gt; Importação da biblioteca flask&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linha 3:&lt;/strong&gt; Aqui criamos uma instancia da classe. O argumento passado é o nome do modulo da aplicação ou pacote.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linha 5:&lt;/strong&gt; Este é um &lt;a href="https://pt.wikipedia.org/wiki/Decorator"&gt;decorator&lt;/a&gt; que cria uma rota "/" ao nosso projeto, ou seja toda vez que nosso projeto for acessado com a URL raiz, a função dá proxima linha será chamada.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linha 6:&lt;/strong&gt; Criamos uma função chamada &lt;code&gt;index()&lt;/code&gt; o nome poderia ser qualquer um ex: &lt;code&gt;home()&lt;/code&gt;, &lt;code&gt;pagina_inicial()&lt;/code&gt;. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linha 7:&lt;/strong&gt; A nossa função retorna uma string com a clássica frase "Hello World!"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linha 9:&lt;/strong&gt; Verifica se nosso programa está sendo executado como um modulo importado ou se está sendo executado diretamente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linha 10:&lt;/strong&gt; Se nosso programa for executado diretamente inicializa nosso projeto flask, escutando na porta 8000 e em modo debug.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Planejando nossa aplicação
&lt;/h2&gt;

&lt;p&gt;Vamos agora pensar um pouco em como nosso gerador de placeholders vai funcionar. A ideia é que caso alguém queira uma imagem basta apontar a url da tag &lt;code&gt;img&lt;/code&gt; para um endereço em nosso site que uma imagem é retornada, ex: imagine que uma pessoa queira simular um banner no inicio de seu site com a largura e altura de 800px 70px repectivamente, ele aponta a url para &lt;code&gt;http://nossosite.com.br/800/70/&lt;/code&gt; e uma imagem é retornada com o tamanho passado como parâmetro na própria url.&lt;br&gt;
Para que isso funcione vamos criar nosso projeto repondendo as seguintes URLs:&lt;/p&gt;
&lt;h3&gt;
  
  
  Lista de URLs
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. "/"&lt;/strong&gt;: Página inicial com o formulário para colocar a largura e altura da imagem gerada, junto com uma pequena apresentação do site.&lt;br&gt;
&lt;strong&gt;2. "/tamanho_pixel/"&lt;/strong&gt;:  Quando a url for um numero nossa aplicação irá criar uma imagem quadrada com o tamanho passado na url.&lt;br&gt;
&lt;strong&gt;3. "/largura_pixel/altura_pixel/&lt;/strong&gt;: Quando a url acessada tiver dois números, nossa aplicação irá criar uma imagem com a largura do primeiro número e altura do segundo número.&lt;/p&gt;
&lt;h3&gt;
  
  
  Pagina Inicial
&lt;/h3&gt;

&lt;p&gt;Vamos criar uma pagina inicial com um formulário perguntando a largura e altura da imagem que queremos criar.&lt;br&gt;
Crie um pasta dentro do projeto chamada &lt;code&gt;templates&lt;/code&gt;, dentro dela crie um arquivo chamado &lt;code&gt;index.html&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;templates
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;templates/index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adicione o conteúdo abaixo dentro do arquivo &lt;code&gt;templates/index.html&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!doctype html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- Required meta tags --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"utf-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1, shrink-to-fit=no"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="c"&gt;&amp;lt;!-- Bootstrap CSS --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css"&lt;/span&gt;
        &lt;span class="na"&gt;integrity=&lt;/span&gt;&lt;span class="s"&gt;"sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk"&lt;/span&gt; &lt;span class="na"&gt;crossorigin=&lt;/span&gt;&lt;span class="s"&gt;"anonymous"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Gerador de placeholder de imagens!&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"row d-flex justify-content-center"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Gerador de placeholder de imagens!&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"row d-flex justify-content-center"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"jumbotron col-md-5"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"container"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"lead"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                    As vezes tudo o que precisamos é de uma imagem temporária
                    para colocar em um projeto ou design em quanto ainda não temos as imagens
                    finais.
                &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;hr&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"my-4"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
                    Crie uma imagem do tamanho que desejar.
                &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"lead"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"input-group mb-3"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"largura"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"form-control"&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Largura da imagem"&lt;/span&gt;
                        &lt;span class="na"&gt;aria-label=&lt;/span&gt;&lt;span class="s"&gt;"largura"&lt;/span&gt; &lt;span class="na"&gt;aria-describedby=&lt;/span&gt;&lt;span class="s"&gt;"largura"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"input-group-append"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"input-group-text"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;px&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

                &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"input-group mb-3"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"altura"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"form-control"&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Altura da imagem"&lt;/span&gt;
                        &lt;span class="na"&gt;aria-label=&lt;/span&gt;&lt;span class="s"&gt;"altura"&lt;/span&gt; &lt;span class="na"&gt;aria-describedby=&lt;/span&gt;&lt;span class="s"&gt;"altura"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"input-group-append"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"input-group-text"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;px&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"btnCriar"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"btn btn-primary"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Criar Imagem&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

    &lt;span class="c"&gt;&amp;lt;!-- Optional JavaScript --&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- jQuery first, then Popper.js, then Bootstrap JS --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://code.jquery.com/jquery-3.5.1.slim.min.js"&lt;/span&gt;
        &lt;span class="na"&gt;integrity=&lt;/span&gt;&lt;span class="s"&gt;"sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj"&lt;/span&gt;
        &lt;span class="na"&gt;crossorigin=&lt;/span&gt;&lt;span class="s"&gt;"anonymous"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"&lt;/span&gt;
        &lt;span class="na"&gt;integrity=&lt;/span&gt;&lt;span class="s"&gt;"sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo"&lt;/span&gt;
        &lt;span class="na"&gt;crossorigin=&lt;/span&gt;&lt;span class="s"&gt;"anonymous"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js"&lt;/span&gt;
        &lt;span class="na"&gt;integrity=&lt;/span&gt;&lt;span class="s"&gt;"sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI"&lt;/span&gt;
        &lt;span class="na"&gt;crossorigin=&lt;/span&gt;&lt;span class="s"&gt;"anonymous"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;

        &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#btnCriar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;click&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;largura&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#largura&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;val&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;altura&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#altura&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;val&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`\&lt;/span&gt;&lt;span class="se"&gt;\$&lt;/span&gt;&lt;span class="s2"&gt;{largura}\&lt;/span&gt;&lt;span class="se"&gt;\$&lt;/span&gt;&lt;span class="s2"&gt;{altura}\&lt;/span&gt;&lt;span class="se"&gt;\`&lt;/span&gt;&lt;span class="s2"&gt;;
            window.location.href = url

        });
    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Basicamente é uma site html simples com dois inputs, um para altura e outro para largura e um botão que envia para a url correta de geração de imagem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exibindo a index.html
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from flask import Flask, render_template

app = Flask(__name__)

@app.route("/")
def index():
    return render_template('index.html')

if __name__ == "__main__":
    app.run(port=8000, debug=True)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As alterações estão nas linhas &lt;strong&gt;1&lt;/strong&gt; onde adicionamos ao import a biblioteca &lt;code&gt;render_template&lt;/code&gt; e na linha &lt;strong&gt;7&lt;/strong&gt; onde agora em vez de retornar uma string retornamos nosso template renderizado como resposta ao acesso a url raiz do nosso site.&lt;/p&gt;

&lt;p&gt;Acesse a pagina e veja nosso formulário.&lt;/p&gt;

&lt;p&gt;É importante que o arquivo &lt;code&gt;index.html&lt;/code&gt; esteja dentro da pasta &lt;code&gt;templates&lt;/code&gt; dentro do nosso projeto, para que o flask o encontre corretamente, a arvore de diretório deve estar igual a isso.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
├── main.py
├── requirements.txt
└── templates
    └── index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Caso tenha algum problema, pare a execução do nosso projeto apertando &lt;code&gt;CTRL+c&lt;/code&gt; na linha de comando e digite novamente &lt;code&gt;python main.py&lt;/code&gt; mas lembre-se o virtualenv tem que estar rodando, na duvida veja &lt;strong&gt;Preparando o ambiente&lt;/strong&gt; no começo deste tutorial.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Com isso nosso primeiro item da &lt;strong&gt;Lista de URLs&lt;/strong&gt; está feito, vamos agora ao item 2.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gerando imagens quadradas
&lt;/h2&gt;

&lt;p&gt;Vamos trabalhar agora no item 2 da nossa lista:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. "/tamanho_pixel/"&lt;/strong&gt;:  Quando a url for um numero nossa aplicação irá criar uma imagem quadrada com o tamanho passado na url.&lt;/p&gt;

&lt;p&gt;Para começar vamos criar uma pasta onde nossas imagens geradas serão armazenadas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;imagens
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora altere o &lt;code&gt;main.py&lt;/code&gt; para ficar parecido com o arquivo abaixo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from flask import Flask, render_template, send_file
from PIL import Image

app = Flask(__name__)

@app.route("/")
def index():
    return render_template('index.html')

@app.route("/&amp;lt;int:tamanho&amp;gt;/")
def gera_imagem_quadrada(tamanho):
    tamanho = max(tamanho, 1)
    tamanho = min(tamanho, 5000)

    img = Image.new('RGB', (tamanho, tamanho), 'lightgray')

    nome_arquivo = f'imagens/{tamanho}x{tamanho}.png'
    img.save(nome_arquivo)

    return send_file(nome_arquivo, mimetype='image/png')

if __name__ == "__main__":
    app.run(port=8000, debug=True)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As alterações foram as seguintes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Linha 1:&lt;/strong&gt; Adicionamos a importação da biblioteca send_file&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linha 2:&lt;/strong&gt; Adição da importação da biblioteca Image do Pillow para criar nossa imagem&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linha 10:&lt;/strong&gt; Criando uma nova rota(URL), essa rota recebe um numero e atribui a uma variável chamada size, o flask garante que esse valor será um numero e não uma string por que colocamos &lt;strong&gt;int:&lt;/strong&gt; como parâmetro.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linha 11:&lt;/strong&gt; Definimos nossa função com o nome gera_imagem_quadrada que recebe o parâmetro size, atenção esse nome de variável tem que ser igual ao nome criado na linha 10.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linha 12:&lt;/strong&gt; A função size é uma função &lt;a href="https://docs.python.org/pt-br/3/library/functions.html"&gt;built-in&lt;/a&gt; que retorna o maior valor entre dois números ou de uma lista. Aqui queremos garantir que o valor não seja menor ou igual a zero, pois imagem com tamanho zero ou negativo não existe.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Linha 13:&lt;/strong&gt; Semelhante a linha anterior mas agora queremos uma tamanho limite para evitar que alguém coloque um tamanho de imagem muito grande e pare nosso site pois ele ficaria muito tempo processando essa imagem.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Linha 15:&lt;/strong&gt; Criamos uma imagem com 3 camadas de cor "RGB" e com as largura e altura igual ao tamanho passado na url, o ultimo parâmetro é a cor de fundo da imagem, que no caso é um cinza claro, e salvamos em uma variável chamada &lt;code&gt;img&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Linha 17:&lt;/strong&gt; Estamos criando uma string que vai indicar o nome da nossa imagem e onde ela será salva, no caso dentro da pasta imagens/ e com o nome do tamanho passado como parâmetro na url, ex: caso seja acessado a url &lt;code&gt;nosso_site/400/&lt;/code&gt; uma string com o texto &lt;code&gt;imagens/400x400.png&lt;/code&gt; será criada.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Linha 18:&lt;/strong&gt; Agora salvamos a imagem utilizando a string criada na linha 17 ex: seguindo o exemplo anterior, ela será salva dentro da pasta &lt;code&gt;imagens&lt;/code&gt; dentro da pasta do projeto com o nome &lt;code&gt;400x400.png&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Linha 20:&lt;/strong&gt; Retornamos a imagem gerada e no cabeçalho da resposta informamos que é do tipo imagem no formato png.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Gerando imagens retangulares
&lt;/h2&gt;

&lt;p&gt;Estamos quase no final do nosso projeto, agora só falta o item 3 da nossa lista de funcionalidades da nossa aplicação.&lt;/p&gt;

&lt;p&gt;Vamos ao código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from flask import Flask, render_template, send_file
from PIL import Image, ImageDraw

app = Flask(__name__)

@app.route("/")
def index():
    return render_template('index.html')

def gera_imagem(largura, altura):
    largura = max(largura, 1)
    largura = min(largura, 5000)

    altura = max(altura, 1)
    altura = min(altura, 5000)

    img = Image.new('RGB', (largura, altura), 'lightgray')

    draw = ImageDraw.Draw(img)
    tamanho_imagem = f'{largura}x{altura}'
    l, a = draw.textsize(tamanho_imagem)
    pos_x = (largura-l)/2
    pos_y = (altura-a)/2
    draw.text( ( pos_x, pos_y ), tamanho_imagem, fill="black" )

    nome_arquivo = f'imagens/{tamanho_imagem}.png'
    img.save(nome_arquivo)

    return nome_arquivo    

@app.route("/&amp;lt;int:tamanho&amp;gt;/")
def gera_imagem_quadrada(tamanho):

    nome_arquivo = gera_imagem(tamanho, tamanho)

    return send_file(nome_arquivo, mimetype='image/png')

@app.route("/&amp;lt;int:largura&amp;gt;/&amp;lt;int:altura&amp;gt;/")
def gera_imagem_retangular(largura, altura):

    nome_arquivo = gera_imagem(largura, altura)

    return send_file(nome_arquivo, mimetype='image/png')

if __name__ == "__main__":
    app.run(port=8000, debug=True)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;\o/ saltamos de 20 linhas para 40, calma não se assuste basicamente fizemos o mesmo que antes com alguns pequenos incrementos, vou explicar somente o que apareceu de novo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Linha 2:&lt;/strong&gt; Importação do modulo ImageDraw, queremos escrever na imagem e ele nos ajuda, veja mais em &lt;a href="https://pillow.readthedocs.io/en/stable/reference/ImageDraw.html"&gt;ImageDraw&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Linha 10:&lt;/strong&gt; Em quanto estava criando a rota de geração de imagens retangulares percebi que boa parte dela erra igual a de geração de imagens quadrada, então resolvi criar uma função que faria a parte igual entre as duas. A função gera imagem, recebe como parâmetro a largura e altura da imagem a ser gerada, ela cria a imagem e depois retorna uma string com o caminho onde ela foi salva.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Linhas 11 a 15:&lt;/strong&gt; Mesma coisa das linhas 12 e 13 da versão anterior do código, só que agora estamos trabalhando com altura e largura.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Linha 19:&lt;/strong&gt; Utilizando o modulo ImageDraw pegamos uma referencia a nossa imagem criada e salvamos na variável draw.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Linha 20:&lt;/strong&gt; Criamos uma string com o tamanho da imagem separado por x, ex: '400x300'.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Linha 21:&lt;/strong&gt; a função text_size do modulo draw retorna o tamanho de um texto passado como parâmetro para ele, no caso o texto está na variável criada na linha anterior. Está função retorna uma tupla (dois valores) com a largura e altura da imagem, que nos salvamos nas variáveis l e a repectivamente.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Linha 22:&lt;/strong&gt; pagamos o tamanho da nossa imagem e subtraímos do tamanho do nosso texto e o resultado é dividido por 2, com isso achamos o ponto onde devemos começar a desenhar nosso texto no eixo x para que ele fique centralizado.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Linha 23:&lt;/strong&gt; semelhante a linha anterior, mas agora calculamos o eixo y.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Linha 24:&lt;/strong&gt; vamos desenha no texto na imagem, passamos uma tupla com as posições x e y calculadas nas linhas 22 e 23, o texto que será escrito que está na variável &lt;code&gt;tamanho_imagem&lt;/code&gt; e o ultimo parâmetro é a cor utilizada que no caso é preta.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Linha 29:&lt;/strong&gt; retornamos o nome do arquivo gerado.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Linha 34:&lt;/strong&gt; substituímos todas as linhas 12 a 18 da versão anterior do nosso código, onde chamamos a função que gera a imagem passado como parâmetro o tamanho da imagem e salvamos em uma variável o retorno.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Linha 38:&lt;/strong&gt; criamos uma nova rota, onde a largura e altura é passado via url.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Linha 39:&lt;/strong&gt; função que será chamada quando nossa rota da linha anterior for acessada.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Linha 41:&lt;/strong&gt; chamamos a função que gera a imagem passado como parâmetro a largura e altura da imagem e salvamos em uma variável o retorno da função.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Linha 43:&lt;/strong&gt; retornamos a imagem criada.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Muita coisa para web pode ser criada facilmente utilizando o framework flask, com poucas linhas de código criamos uma aplicação simples e funcional. &lt;br&gt;
Claro que este projeto ainda não está pronto para colocar em produção, é necessário algumas melhorias, como apagar imagens antigas para que não sobrecarreguem o servidor, antes de gerar uma nova imagem, verificar se ela já existe, etc. Mas como um pequeno estudo é um bom exemplo. &lt;/p&gt;

</description>
      <category>python</category>
      <category>flask</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
