Vimos muita teoria até agora, alguns outros tópicos de coisas mais práticas, mas agora vamos deixar as coisas mais interessantes. Neste terceiro projeto vamos criar uma aplicação com Flask que vai rodar localmente na nossa máquina e em seguida vamos subir o projeto na web (ou seja, fazer o deploy). Então vamos passar por tópicos importantes sobre web, sobre o protocolo HTTP, iremos aprender a criar uma conta no Github, etc.
Já criei um tópico aqui sobre Flask de forma bem rudimentar mas agora vamos meter a mão na massa em algo mais útil.
Pra começar a esquentar, vamos instalar o Flask. Então, vamos criar um ambiente virtual e em seguida instalar a lib dentro dele.
$ python -m venv venv # Criando o ambiente virtual
> venv\Scripts\activate # Ativando o ambiente virtual no Windows
$ source venv/bin/activate # Ativando o ambiente virtual no Linux e no Mac
(venv) $ pip install flask
O flask é um microframework web, que, trocando em miúdos, nada mais é do que um conjunto de pacotes que facilitam a nossa vida de subir uma aplicação web. E ele é micro porque ele vem só com o básico para subirmos uma aplicação. Se precisarmos acessar bancos de dados, por exemplo, precisamos instalar módulos extras. O Flask é diferente de outro framework web de Python nesse quesito que é o Django, que já vem com praticamente tudo incluso nele. Mas isso é assunto pra depois.
Pra ver se tá dando tudo certo, vamos criar um esboço do que é uma aplicação em Flask:
Primeiro, vamos criar um script e importar o Flask:
from flask import Flask
Logo em seguida, eu preciso criar uma instância de Flask. Mas o que diabos é uma instância?
### Observação ###: Segue abaixo uma explicação bem rasa sobre orientação a objetos. Não é necessário entender isso agora então caso achem complicado podem pular para o "### Fim da observação ###" logo abaixo.
---------------------------------------------------------------------------
Instância é uma representação de um objeto. Iremos abordar mais a fundo esses termos nos tópicos teóricos sobre programação orientada a objetos. E a minha intenção inicial antes de criar este projeto era já ter visto orientação a objetos antes com vocês aqui, mas como esse assunto é muito denso e não seria visto rapidamente, pensei que poderíamos passar mais superficialmente agora pra na hora da teoria ficar mais claro.
Mas só pra exemplificar, imaginem que eu tenho uma classe chamada Cachorro e todos os cachorros do mundo derivam dessa classe. Cada cachorro é uma instância da classe Cachorro. Em código seria algo mais ou menos assim:
class Cachorro:
def __init__(self, patas, rabo, late):
self.patas = patas
self.rabo = rabo
self.late = late
cachorro_1 = Cachorro(patas=4, rabo=True, late=True)
cachorro_2 = Cachorro(patas=3, rabo=True, late=True)
cachorro_3 = Cachorro(patas=4, rabo=False, late=False)
Não vou detalhar o que cada linha diz acima pois vamos ver isso em orientação a objetos, mas basicamente eu criei uma caixa gigante chamada Cachorro e todos os cachorros do mundo derivam dessa caixa grande, como o cachorro 1 que tem 4 patas, que tem rabo e que lata, e o cachorro 3 que tem 4 patas, mas não tem rabo e ainda é mudo, coitado. Cada cachorro desses é uma instância da classe Cachorro.
Então, quando eu crio uma instância de cachorro assim:
cachorro_1 = Cachorro(patas=4, rabo=True, late=True)
Eu crio uma instância de flask também assim:
app = Flask(__name__)
Ou seja, Flask é uma classe assim como Cachorro é uma classe. E uma instância de Cachorro recebe atributos ao ser inicializada, que no nosso caso são os atributos patas, rabo e late. No caso do flask, ele recebe o argumento __name__ como atributo, que no frigir dos ovos indica para o Python que nosso app vai rodar dentro desse meu script recém criado.
Enfim, eu não precisava detalhar isso agora mas eu gosto de explicar dessa forma porque quando eu tentava entender essas coisas pela primeira vez eu não entendia o que diabos era uma instância, uma classe, etc.
--------------------------------------------------------------------------
### Fim da observação ###
Portanto, até o momento temos:
from flask import Flask
app = Flask(__name__)
Que quer dizer que importei a classe Flask para dentro do meu programa e que instanciei um objeto da classe Flask passando como argumento o atributo __name__. Não se preocupem com esse __name__ agora.
Pra botar nosso app pra rodar basta isso:
app.run()
Com o código até o momento assim:
from flask import Flask
app = Flask(__name__)
app.run()
Rodando a aplicação o console nos retorna uma resposta parecida com essa:
* Serving Flask app "app" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [26/Nov/2019 23:28:36] "GET / HTTP/1.1" 404 -
O que isso quer dizer é que nosso script criou uma aplicação flask num servidor local no endereço 127.0.0.1 na porta 5000. Acessando esse endereço no nosso navegador aparece um "404 Not Found". Mas nosso servidor já está rodando.

Agora eu preciso dizer para o Flask "roda aí na url principal alguma coisa".
Então eu preciso criar uma rota. Para isso vou usar um decorador (ainda iremos ver decoradores na teoria) que vai receber uma função que mostra o que eu quero na tela ao rodar o servidor.
Vamos criar essa rota:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'hello world'
app.run()
O que fizemos acima: Eu disse para o flask "na rota '/' roda a função index", e a função retorna um simples "hello world". Vamos rodar agora o servidor e acessar nossa url 127.0.0.1:5000 novamente:

Mas eu tou rodando código no navegador, e navegador lê, além de outros formatos, arquivos html. Então vamos rodar um código html no nosso navegador mudando nossa função da rota para isso (lembrem dos tópicos de html já abordados aqui):
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return '''
<h1>Hello world</h1>
<h2>Aqui temos uma tag h2</h2>
<h3>E aqui uma tag h3</h3>
<p>E aqui um parágrafo</p>
'''
app.run()
E agora rodando:

Enfim, este é um esboço bem grosseiro do que iremos usar para criar nosso site. Este projeto será mais longo que os anteriores, talvez, e será de algo bem mais mão na massa do que muita coisa que postei por aqui, então espero que gostem. Até mais.