Exponha seu app Django na internet com Ngrok: Guia completo!

Foto do autor

By luis

Vamos explorar como tornar um aplicativo Django de demonstração acessível na internet, sem a necessidade de hospedá-lo em um serviço de deploy.

Configurar um ambiente de implantação de teste apenas para demonstrar seu aplicativo Django pode ser complicado. Especialmente se você precisa de uma URL temporária para mostrar a um cliente ou colega.

A melhor solução é utilizar uma ferramenta que exponha seu servidor local. Isso mesmo! Pessoas de qualquer lugar do mundo poderão ver o que está acontecendo em seu localhost.

Para isso, usaremos o Ngrok. Esta ferramenta permite gerar URLs públicas a partir das portas locais do seu computador, através da tecnologia de túneis.

Todo o código deste tutorial está disponível neste Repositório Github, para sua referência.

Requisitos Essenciais

É recomendável ter algum conhecimento prévio sobre os tópicos abordados, mas mesmo sem ele, você provavelmente conseguirá acompanhar este guia sem dificuldades.

Criando um Aplicativo Django

Para este tutorial, vamos detalhar o processo de criação de um projeto Django. Se você já tiver um projeto, pode pular esta seção.

Ambiente Virtual

Primeiramente, vamos criar um ambiente virtual Python.

  • Abra o terminal do seu sistema (ou shell).
  • Se abrir o terminal do sistema for complicado, use o terminal integrado do seu editor de código.
  • Acesse Terminal>Novo terminal e um shell aparecerá na parte inferior da tela.
  • Digite o comando abaixo para criar um ambiente virtual, usando a ferramenta integrada do Python.
python -m venv .venv

Este comando significa:

Python, crie um ambiente virtual (-m venv) nomeado “.venv”.

  • Ao listar os arquivos do seu diretório, você deverá ver uma pasta chamada “.venv”.
$ ls -l
drwxr-xr-x    - daniel 30 abr 23:12 .venv
# Outros arquivos ...
  • Para ativar o ambiente virtual, utilize o comando source.
source .venv/bin/activate
Plataforma Shell Comando para ativar ambiente virtual
POSIX bash/zsh $ source <venv>/bin/activate
fish $ source <venv>/bin/activate.fish
csh/tcsh $ source <venv>/bin/activate.csh
PowerShell Core $ <venv>/bin/Activate.ps1
Windows cmd.exe C:> <venv>\Scripts\activate.bat
PowerShell PS C:> <venv>\Scripts\Activate.ps1

Se o comando foi executado corretamente, o nome do ambiente virtual aparecerá no seu shell.

$ source .venv/bin/activate.fish

(.venv) $ 

Instalando o Django

Com o ambiente virtual ativado, você pode instalar qualquer versão do Django. Para este tutorial, usaremos a versão mais recente.

$ pip install django
Collecting django
  Using cached Django-3.2-py3-none-any.whl (7.9 MB)
Collecting pytz
  Using cached pytz-2021.1-py2.py3-none-any.whl (510 kB)
Collecting asgiref<4,>=3.3.2
  Using cached asgiref-3.3.4-py3-none-any.whl (22 kB)
Collecting sqlparse>=0.2.2
  Using cached sqlparse-0.4.1-py3-none-any.whl (42 kB)
Installing collected packages: pytz, asgiref, sqlparse, django
Successfully installed asgiref-3.3.4 django-3.2 pytz-2021.1 sqlparse-0.4.1

Agora, criaremos a estrutura básica do projeto Django que será exposto.

$ django-admin startproject mytestingproject

Este comando cria um projeto Django chamado “mytestingproject”. Entre na pasta onde a estrutura do projeto foi criada e execute o servidor Django.

# Entrando na pasta do projeto
(.venv)$ cd mytestingproject/

# Listando os arquivos dentro do projeto
(.venv) $ ls
mytestingproject  manage.py 

Agora que você está dentro da pasta do projeto, vamos executar o servidor Django.

 (.venv) $python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
May 01, 2021 - 04:34:25
Django version 3.2, using settings 'mytestingproject.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

O Django informa que um servidor local está rodando no localhost (127.0.0.1) na porta padrão 8000.

Não se preocupe com as mensagens de aviso. Primeiro, vamos testar se tudo está funcionando no nosso servidor local. Abra o navegador e digite a seguinte URL:

http://localhost:8000/
# Lembre-se que localhost e 127.0.0.1 são equivalentes!

Se tudo estiver correto, você verá a página inicial padrão do Django.

Isso conclui a configuração do Django. Agora, vamos expor este projeto Django. Os métodos para expor um aplicativo Django também funcionarão com projetos mais complexos.

Expondo um Aplicativo Django com Ngrok

Como mencionado, o Ngrok é uma ferramenta que permite disponibilizar seu servidor local na internet. Primeiro, baixe o Ngrok no site oficial.

Após a instalação, vamos executar os comandos necessários.

Abra um novo shell, mantendo o terminal onde o servidor Django está sendo executado, e digite o seguinte comando:

$  ngrok help
NAME:
   ngrok - tunnel local ports to public URLs and inspect traffic

More commands ....

Este comando mostra os comandos disponíveis no Ngrok, confirmando que a instalação ocorreu corretamente.

Para criar uma URL que permita o acesso ao seu servidor, use o comando abaixo.

    $ ngrok http 8000 
# URL pública e segura para o servidor web na porta 8000

O argumento “http” cria uma URL que se conecta à porta 8000 do seu localhost.

Este é o resultado que você deverá ver:

ngrok by @inconshreveable                                                                      (Ctrl+C to quit)
                                                                                                               
Session Status                online                                                                           
Session Expires               1 hour, 59 minutes                                                               
Update                        update available (version 2.3.39, Ctrl-U to update)                              
Version                       2.3.35                                                                           
Region                        United States (us)                                                               
Web Interface                 http://127.0.0.1:4040                                                            
Forwarding                    http://cac2165aa7f8.ngrok.io -> http://localhost:8000                            
Forwarding                    https://cac2165aa7f8.ngrok.io -> http://localhost:8000                           
                                                                                                               
Connections                   ttl     opn     rt1     rt5     p50     p90                                      
                              0       0       0.00    0.00    0.00    0.00       

O Ngrok está encaminhando essa URL para seu localhost. A mágica acontece quando você acessa essa URL no seu navegador.

Ajustando o settings.py

O que aconteceu 😱?

Parece que o Django está retornando um erro devido à configuração DisallowedHost. Se você verificar os shells onde o servidor Django e a sessão Ngrok estão rodando, verá algumas mensagens de depuração.

# Mensagens do Django
Invalid HTTP_HOST header: 'cac2165aa7f8.ngrok.io'. You may need to add 'cac2165aa7f8.ngrok.io' to ALLOWED_HOSTS.
Bad Request: /
[01/May/2021 05:07:46] "GET / HTTP/1.1" 400 65196
Invalid HTTP_HOST header: 'cac2165aa7f8.ngrok.io'. You may need to add 'cac2165aa7f8.ngrok.io' to ALLOWED_HOSTS.

# Mensagens do Ngrok
HTTP Requests                                                            
-------------                                                            
                                                                         
GET /favicon.ico               400 Bad Request                           
GET /                          400 Bad Request                           
                                              

O Django exige que o domínio usado para conexão seja adicionado à variável de configuração ALLOWED_HOSTS. O problema é que o domínio gerado pelo Ngrok é longo e complexo.

Vamos modificar as configurações do Django para resolver este problema. Abra o arquivo settings.py, localizado na pasta do seu projeto.

# mytestingproject/settings.py

# Linha 28

# Alterar de
ALLOWED_HOSTS = []

# Para

ALLOWED_HOSTS = ["*"]

Com a expressão “*”, estamos permitindo que qualquer host seja aceito. Recarregue a página no navegador para ver o resultado.

Tudo está funcionando corretamente agora! Se você criar novas funcionalidades e rotas para seu projeto, elas serão refletidas nesta URL pública.

Importante: Lembre-se de alterar o ALLOWED_HOSTS em um ambiente de produção, pois esta configuração é um risco de segurança.

Conclusão

Neste guia, você aprendeu como gerar uma URL para seu projeto Django, sem a necessidade de um deploy.

Você praticou como iniciar um projeto Django e como alterar o arquivo settings.py.

Finalmente, você aprendeu como usar o Ngrok para expor qualquer servidor local.

Agora, explore alguns frameworks populares em Python para criar APIs.