Python Flask Fazendo deploy com Apache
Aprendar a configurar o servidor Apache com a aplicação Flask (Python)
Quando você construir uma aplicação em Flask, com certeza irá querer ver o resultado dela em um navegador. Você pode fazer isso executando o servidor local do Flask, por exemplo:
python myapp.py
* Running on http://127.0.0.1:5000/
Mas você não pode, ou pelo menos não deveria, usar o servidor local para publicar sua aplicação. O correto é você integrar o Flask a um servidor web ou a qualquer umas das opções que o framework nos permite. Esse processo de passar sua aplicação do ambiente de desenvolvimento para o ambiente de produção é conhecido como deploy.
Deployment (“implantação”) é a fase do ciclo de vida de um software que corresponde à passagem do software para a produção.
Fonte wikipedia
A documentação do Flask nós dá algumas opções de deploy:
- mod_wsgi (Apache)
- Standalone WSGI Containers
- uWSGI
- FastCGI
- CGI
Neste artigo mostrarei como fazer o deploy do Flask com o Apache (utilizando o módulo mod_wsgi
).
O exemplo consiste em definir uma URL para o projeto, por exemplo www.flask-test.loc
e, após acessar a URL, ver o
resultado “Hello World!”. Você precisará ter o módulo WSGI instalado além do próprio
Apache.
A estrutura de arquivos
Vamos utilizar a seguinte estrutura de arquivos.
/projetos
/flask-test
myapp.py
wsgi.py
Este exemplo se baseia no sistema Linux, logo, eu sugiro que o caminho /projeto
seja na verdade algo parecido com isto:
/home/seu-usuario/projetos
/flask-test
myapp.py
wsgi.py
Por que? Porque dessa forma você terá acesso indiscriminado a pasta de projetos, em outras palavras, se você realmente
colocar o exemplo na pasta /projetos
você precisará ter acesso à ela como root
ou dar permissões para seu usuário.
Você deve decidir onde colocar o exemplo deste tutorial.
Lembre-se de trocar o trecho /seu-usuario/
por seu usuário de verdade.
Os arquivos
Nosso arquivo principal terá o mesmo conteúdo do exemplo “Hello World!” que eu demonstrei no artigo anterior e que você
também encontra na documentação do Flask. A diferença é que agora o arquivo chama-se myapp.py
.
#
# Conteudo do arquivo `myapp.py`
#
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run()
Precisamos de um arquivo para fazer “a ligação”, esse arquivo se chamará wsgi.py
e seu conteúdo você confere logo
abaixo. Atente para o endereço após o trecho sis.path.insert(0,
, ele deve apontar para a pasta de seu projeto.
#
# Conteudo do arquivo `wsgi.py`
#
import sys
sys.path.insert(0, "/home/seu-usuario/projetos/flask-test")
from myapp import app as application
Lembre-se de testar os arquivos via terminal, comece pelo arquivo myapp.py
, execute:
python myapp.py
Se o arquivo estiver correto, ele acionará o servidor local do Flask e disponibilizará o endereço http://127.0.0.1:5000/
.
Teste também o arquivo wsgi.py
, execute:
python wsgi.py
O terminal deve ficar em “silêncio”, ou seja, não irá reclamar de nada.
Configurando o Virtual Host
Vamos colocar a mão no Apache, mas antes, vamos alterar o arquivo hosts para que ele faça o
redirecionamento de www.flask-test.loc
para o endereço 127.0.0.1
.
Acesse o arquivo hosts no endereço /etc/hosts
e inclua o conteúdo abaixo.
127.0.0.1 localhost
127.0.0.1 www.flask-test.loc
Eu estou utilizando o exemplo www.flask-test.loc
, mas você pode utilizar a URL que preferir. Apenas certifique-se de
replicá-la no arquivo de Virtual Host, falando nele…
Agora devemo criar um arquivo contendo as informações de nossa Virtual Host.
Este exemplo é válido para o sistema Debian e você terá que fazer as devidas adaptações para o sistema da famíla HedHat.
Na pasta /etc/apache2/sites-available
crie um arquivo de texto simples denominado flask
e insira o seguinte conteúdo.
<VirtualHost *:80>
ServerName www.flask-test.loc
WSGIDaemonProcess flaskTest threads=5
WSGIScriptAlias / /home/seu-usuario/projetos/flask-test/wsgi.py
<Directory /home/seu-usuario/projetos/flask-test/>
WSGIProcessGroup flaskTest
WSGIApplicationGroup %{GLOBAL}
WSGIScriptReloading On
Order deny,allow
Allow from all
</Directory>
</VirtualHost>
Cada arquivo na pasta acima mencionada refere-se a um Virtual Host, porém ainda não estão disponíveis. Para habilitar um Virtual Host siga os passos abaixo.
#
# Vá até a pasta `sites-available`
#
cd /etc/apache2/sites-available
#
# Habilite o Virtual Host recém criado
#
a2ensite flask
#
# Reinicie o Apache
#
service apache2 reload
Testando
Agora é hora de ver tudo funcionado.
Acesse o endereço http://www.flask-test.loc/
segundo o nosso exemplo ou o endereço que você definiu e veja o
resultado esperado:
Hello World!
Neste momento é comum aparecer o erro “Internal Server Error”, para solucionar o problema você deve tentar entender melhor o que está acontecendo, para isso veja o arquivo de log do Apache.
# no Debian
/var/log/apache2/error.log
# para família RedHat.
tail /var/log/httpd/error_log
Um dos comandos acima (dependendo da usa distro) deve lhe trazer mais informações sobre o erro que está acontecendo.