Configure o servidor de desenvolvimento Flask para ficar visível na rede

442

Não tenho certeza se isso é específico do Flask, mas quando executo um aplicativo no modo dev ( http://localhost:5000), não consigo acessá-lo de outras máquinas na rede (com http://[dev-host-ip]:5000). Com o Rails no modo dev, por exemplo, ele funciona bem. Não encontrei nenhum documento referente à configuração do servidor de desenvolvimento Flask. Alguma idéia do que deve ser configurado para permitir isso?

sa125
fonte

Respostas:

712

Embora isso seja possível, você não deve usar o servidor de desenvolvimento Flask na produção. O servidor de desenvolvimento Flask não foi projetado para ser particularmente seguro, estável ou eficiente. Consulte os documentos sobre implantação para soluções corretas.


Adicione um parâmetro ao seu app.run(). Por padrão, ele é executado no host local, altere-o para app.run(host= '0.0.0.0')ser executado no endereço IP da sua máquina.

Documentado no site do Flask em "Servidor visível externamente" na página Início rápido :

Servidor externamente visível

Se você executar o servidor, notará que o servidor está disponível apenas no seu próprio computador, não em qualquer outro na rede. Esse é o padrão, porque no modo de depuração, um usuário do aplicativo pode executar código Python arbitrário no seu computador. Se você tiver desabilitado a depuração ou confiar nos usuários da sua rede, poderá disponibilizar o servidor publicamente.

Apenas mude a chamada do run()método para ficar assim:

app.run(host='0.0.0.0')

Isso diz ao seu sistema operacional para ouvir em um IP público.

Shawn Swaner
fonte
44
Para definir a um app.run específica ip (host = "192.168.1.7", port = 5010) útil se o seu PC tem um ip alguns de
LXX
2
como acessar o script frasco globalmente, hospedagem em meu próprio servidor
PYD
Essa solução também funciona para contêineres do Docker. Este post descreve a solução para esses casos.
para mac: não consegui acessar meu aplicativo de balão em 0.0.0.0 (mesmo que tenha sido veiculado lá), exceto segmentando o domínio especificado em Preferências do Sistema> Compartilhamento . O domínio deve ser algo como mymacname.local.
Nico Cernek
14
De alguma forma, no meu Mac, preciso usar explicitamente flask run --host 0.0.0.0para fazê-lo funcionar.
Minh Nghĩa
122

Se você usar o executável do balão para iniciar o servidor, poderá flask run --host=0.0.0.0alterar o padrão de 127.0.0.1 e abri-lo para conexões não locais. Os métodos config e app.run descritos pelas outras respostas provavelmente são práticas recomendadas, mas isso também pode ser útil.

Servidor externamente visível Se você executar o servidor, notará que o servidor só pode ser acessado em seu próprio computador, não em nenhum outro da rede. Esse é o padrão, porque no modo de depuração, um usuário do aplicativo pode executar código Python arbitrário no seu computador.

Se você tiver o depurador desativado ou confiar nos usuários da sua rede, poderá disponibilizar o servidor publicamente simplesmente adicionando --host = 0.0.0.0 à linha de comando:

flask run --host = 0.0.0.0 Isso informa ao seu sistema operacional para ouvir todos os IPs públicos.

Referência: http://flask.pocoo.org/docs/0.11/quickstart/

Ária
fonte
2
Não sei se alguém já o experimentou, mas tentei esse método primeiro de acordo com os documentos do QuickStart, mas por algum motivo estranho o IP continuava sendo executado 127.0.0.1(eu configurei meu executável do Flask corretamente ou, pelo que parecia, não foi certo o que eu estava fazendo errado). No entanto, depois de adicionar app.run(host='0.0.0.0')como observado em outra resposta ao meu arquivo do servidor, consegui acessar a página através das redes. Alguém mais tem um problema como o que eu descrevi ou tem alguma informação sobre ele?
twknab
2
Para mim, a execução do balão --host = 0.0.0.0 resolve o problema. Consegui acessar url -http: // <endereço IP>: 5000. Primeiro, verifiquei quais são as portas abertas na máquina usando o comando - sudo firewall-cmd --zone = public --list-ports, depois vim a saber que a porta 5000 não está aberta. Abri essa porta usando o comando - sudo firewall-cmd --zona = public --permanent --add-port = 5000 / tcp seguido por sudo firewall-cmd --reload. em seguida, executar a aplicação balão como - balão de execução --host = 0.0.0.0
Pintu Kumar
23

Tente isso se o método 0.0.0.0 não funcionar

Coisas chatas

Pessoalmente, lutei bastante para tornar meu aplicativo acessível a outros dispositivos (laptops e telefones celulares) por meio de um servidor local. Eu tentei o método 0.0.0.0, mas sem sorte. Então tentei mudar a porta, mas simplesmente não funcionou. Então, depois de tentar várias combinações diferentes, cheguei a essa e resolvi meu problema de implantar meu aplicativo em um servidor local.

Passos

  1. Obtenha o endereço IPv4 local do seu computador. Isso pode ser feito digitando ipconfigno Windows e ifconfigno linux e Mac.

IPv4 (Windows)

Observe: A etapa acima deve ser executada na máquina em que você está servindo o aplicativo e não na máquina em que está acessando. Observe também que o endereço IPv4 pode mudar se você se desconectar e se reconectar à rede.

  1. Agora, basta executar o aplicativo do balão com o endereço IPv4 adquirido.

    flask run -h 192.168.X.X

    Por exemplo, no meu caso (veja a imagem), executei-o como:

    flask run -h 192.168.1.100

executando o aplicativo balão

No meu dispositivo móvel

captura de tela do meu celular

Material opcional

Se você estiver executando este procedimento no Windows e usando o Power Shell como CLI, e ainda não conseguir acessar o site, tente um comando CTRL + C no shell que está executando o aplicativo. O Power Shell fica congelado algumas vezes e precisa de uma pitada para reviver. Fazer isso pode até finalizar o servidor, mas às vezes funciona.

É isso aí. Dê um joinha se você achou isso útil.😉

Algumas coisas mais opcionais

Criei um script curto do Powershell que fornecerá seu endereço IP sempre que você precisar de um:

$env:getIp = ipconfig
if ($env:getIp -match '(IPv4[\sa-zA-Z.]+:\s[0-9.]+)') {
    if ($matches[1] -match '([^a-z\s][\d]+[.\d]+)'){
        $ipv4 = $matches[1]
    }
}
echo $ipv4

Salve-o em um arquivo com extensão .ps1 (para PowerShell) e execute-o antes de iniciar seu aplicativo. Você pode salvá-lo na pasta do projeto e executá-lo como:

.\getIP.ps1; flask run -h $ipv4

Nota: Salvei o código do shell acima em getIP.ps1.

Cool.👌

nwillo
fonte
1
sim! funciona. consigo acessá-lo no meu celular configurando ipv4 ip para balão. espero que também ajude outros :)
Ashu Kumar
@nwillo do mobile e a máquina na qual sirvo esteja conectada à mesma rede / wifi.
sachin rathod 27/03
@sachinrathod yes. eles tem que. É assim que eles podem acessar o mesmo gateway IP.
nwillo 30/04
22

Se o seu coolaplicativo tiver sua configuração carregada de um arquivo externo, como no exemplo a seguir, não se esqueça de atualizar o arquivo de configuração correspondente com HOST = "0.0.0.0"

cool.app.run(
    host=cool.app.config.get("HOST", "localhost"),
    port=cool.app.config.get("PORT", 9000)
)            
mircealungu
fonte
1
Essa é uma boa maneira de armazenar também o nome do host e o número da porta na configuração do balão. Eu estava procurando exatamente essa solução.
Comp1
20

Adicione linhas abaixo ao seu projeto

if __name__ == '__main__':
    app.debug = True
    app.run(host = '0.0.0.0',port=5005)
Jeevan Chaitanya
fonte
Estou recebendoOSError: [WinError 10013] An attempt was made to access a socket in a way forbidden by its access permissions
pyd 02/02
Para maneiras de corrigir Você precisa executar o arquivo python com run como administrador e verificar se alguma porta está sendo executada no Windows netstat -na|findstr 5005.
Jeevan Chaitanya
10

Verifique se a porta específica está aberta no servidor para atender o cliente ou não?

na distribuição Ubuntu ou Linux

sudo ufw enable
sudo ufw allow 5000/tcp //allow the server to handle the request on port 5000

Configure o aplicativo para lidar com solicitações remotas

app.run(host='0.0.0.0' , port=5000)


python3 app.py & #run application in background
Rajesh Prasad Yadav
fonte
5

Vá para o caminho do seu projeto no CMD (prompt de comando) e execute o seguinte comando: -

defina FLASK_APP = ABC.py

SET FLASK_ENV = desenvolvimento

execução do balão -h [yourIP] -p 8080

você receberá o / p no CMD: -

  • Exibição do aplicativo Flask "expirement.py" (carregamento lento)
    • Ambiente: desenvolvimento
    • Modo de depuração: ativado
    • Reiniciando com stat
    • O depurador está ativo!
    • PIN do depurador: 199-519-700
    • Executando em http: // [yourIP]: 8080 / (pressione CTRL + C para sair)

Agora você pode acessar seu aplicativo de balão em outra máquina usando http: // [yourIP]: 8080 / url

Ibz.Shaikh
fonte
4

Se você estiver tendo problemas para acessar o servidor Flask, implantado usando o PyCharm , leve em consideração o seguinte:

O PyCharm não executa seu arquivo .py principal diretamente, portanto, nenhum código if __name__ == '__main__':será executado e quaisquer alterações (como app.run(host='0.0.0.0', port=5000)) não terão efeito.

Em vez disso, você deve configurar o servidor Flask usando Configurações de execução, em particular, colocando --host 0.0.0.0 --port 5000no campo Opções adicionais .

Execute co-configurações do servidor Flask PyCharm

Mais sobre como configurar o servidor Flask no PyCharm

Viacheslav Z
fonte
Isso realmente resolveu todos os meus problemas e deve ser a resposta correta para essa pergunta!
Alberto Bellini
3

Eu tive o mesmo problema, uso o PyCharm como editor e, quando criei o projeto, o PyCharm criou um servidor de balão. O que eu fiz foi criar um servidor com Python da seguinte maneira;

Configurar PyCharm do servidor Python basicamente o que eu fiz foi criar um novo servidor, mas balão, se não python

Espero que ajude você

Juanes30
fonte
Não basta postar uma imagem - descreva especificamente o que você faz que resolve o problema.
CertainPerformance
Ei, claro, se eu já estou editando o post para melhorar a resposta.
precisa saber é o seguinte
3

Esta resposta não está relacionada apenas ao balão, mas deve ser aplicável a todos que não podem conectar o serviço de outro problema de host .

  1. use netstat -ano | grep <port>para ver se o endereço é 0.0.0.0 ou ::. Se for 127.0.0.1, será apenas para solicitações locais.
  2. use tcpdump para ver se está faltando algum pacote. Se mostrar um desequilíbrio óbvio, verifique as regras de roteamento pelo iptables.

Hoje, eu executo meu aplicativo de balão como de costume, mas notei que ele não pode se conectar a partir de outro servidor. Então eu corro netstat -ano | grep <port>, e o endereço local é ::or 0.0.0.0(tentei ambos, e sei que 127.0.0.1 permite apenas a conexão do host local). Então eu usei telnet host port, o resultado é como connect to .... Isso é muito estranho. Então eu pensei que seria melhor verificar com tcpdump -i any port <port> -w w.pcap. E eu notei que é tudo assim:

O resultado do tcpdump mostra que há apenas pacotes SYN do host remoto

Então, marcando a iptables --listseção OUTPUT, pude ver várias regras:

resultado da lista iptables

essas regras proíbem pacotes vitais de saída TCP em handshaking. Ao excluí-los, o problema se foi.

Tiina
fonte
3

Para mim, segui a resposta acima e a modifiquei um pouco:

  1. Basta pegar seu endereço ipv4 usando ipconfig no prompt de comando
  2. Vá para o arquivo no qual o código do balão está presente
  3. Na função principal, escreva app.run (host = 'seu endereço ipv4')

Por exemplo:

insira a descrição da imagem aqui

Arsalan Fakhar
fonte
1

vá para o conjunto de caminhos do projeto FLASK_APP = ABC.py SET FLASK_ENV = development

flask run -h [yourIP] -p 8080 você seguirá o / p no CMD: - * Servindo o aplicativo Flask "expirement.py" (carregamento lento) * Ambiente: desenvolvimento * Modo de depuração: ativado * Reiniciando com stat * O depurador está ativo ! * PIN do depurador: 199-519-700 * Executando em http: // [yourIP]: 8080 / (Pressione CTRL + C para sair)

Ibz.Shaikh
fonte
1

Você também pode definir o host (para expô-lo em uma rede voltada para o endereço IP) e a porta por meio de variáveis ​​de ambiente.

$ export FLASK_APP=app.py
$ export FLASK_ENV=development
$ export FLASK_RUN_PORT=8000
$ export FLASK_RUN_HOST=0.0.0.0

$ flask run
 * Serving Flask app "app.py" (lazy loading)
 * Environment: development
 * Debug mode: on
 * Running on https://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 329-665-000

Consulte Como obter todas as opções de comando disponíveis para definir variáveis ​​de ambiente?

Everett Toews
fonte
1

Crie um arquivo .flaskenvno diretório raiz do projeto.

Os parâmetros neste arquivo são geralmente:

FLASK_APP=app.py
FLASK_ENV=development
FLASK_RUN_HOST=[dev-host-ip]
FLASK_RUN_PORT=5000

Se você tiver um ambiente virtual, ative-o e faça a pip install python-dotenv.

Este pacote usará o .flaskenvarquivo e as declarações nele serão automaticamente importadas nas sessões do terminal.

Então você pode fazer flask run

Saurabh
fonte