Recarregar automaticamente o aplicativo python Flask após alterações de código

202

Estou investigando como desenvolver um aplicativo Web decente com o Python. Como não quero que algumas estruturas de alta ordem entrem no meu caminho, minha escolha recaiu sobre a estrutura leve do Flask . O tempo dirá se essa foi a escolha certa.

Então, agora eu configurei um servidor Apache com mod_wsgi e meu site de teste está funcionando bem. No entanto, eu gostaria de acelerar a rotina de desenvolvimento, fazendo o site recarregar automaticamente após qualquer alteração nos arquivos py ou modelo que eu fizer. Vejo que qualquer alteração no arquivo .wsgi do site causa o recarregamento (mesmo sem o WSGIScriptReloading On no arquivo de configuração do apache), mas ainda preciso produzi-lo manualmente (por exemplo, inserir quebra de linha extra, salvar). Existe alguma maneira de causar a recarga quando edito alguns dos arquivos py do aplicativo? Ou, devo usar o IDE que atualiza o arquivo .wsgi para mim?

Sexta-feira
fonte

Respostas:

228

A maneira atual recomendada é com o flaskutilitário de linha de comando.

https://flask.palletsprojects.com/en/1.1.x/quickstart/#debug-mode

Exemplo:

$ export FLASK_APP=main.py
$ export FLASK_ENV=development
$ flask run

ou em um comando:

$ FLASK_APP=main.py FLASK_ENV=development flask run

Se você deseja uma porta diferente da opção de 5000adição padrão ( ) --port.

Exemplo:

$ FLASK_APP=main.py FLASK_ENV=development flask run --port 8080

Mais opções estão disponíveis com:

$ flask run --help
Eyal Levin
fonte
3
ou pyvenv em python3.5, flask runtambém funciona, pois quando você pip install flasktambém instala um arquivo executável em um frasco na venv/bin/pasta.
TonyTony 4/17
Esta é uma solução simples que pode ser traduzida para o Docker para fins de desenvolvimento. Pode-se ver esta mesma solução aqui .
Funciona bem normalmente, mas isso não parece funcionar no Ubuntu com código em uma partição NTFS. Não é um problema com o código, mas o balão parece não reconhecer alterações nessa configuração.
citynorman 21/01
210

Se você está falando sobre ambientes de teste / desenvolvimento, basta usar a opção de depuração. Ele recarregará automaticamente o aplicativo de balão quando ocorrer uma alteração de código.

app.run(debug=True)

Ou, a partir do shell:

$ export FLASK_DEBUG=1
$ flask run

http://flask.pocoo.org/docs/quickstart/#debug-mode

codegeek
fonte
6
Isso funciona apenas quando você executa o site por meio do servidor de desenvolvimento interno. Mas não ao executá-lo via wsgi, no Apache. E não insisto que realmente precise executá-lo no Apache, então talvez o que você sugere seja o caminho certo para fazê-lo.
Sexta-
4
corrigir. No ambiente de desenvolvimento, o servidor interno funciona muito bem e você não precisa reinventar a roda para recarregar o aplicativo. Eu recomendo fortemente que você use o servidor interno para dev. propósitos. De qualquer maneira, no prod, você não deseja recarregar automaticamente o aplicativo a cada alteração de código.
Codegeek
44

Em ambientes de teste / desenvolvimento

O depurador do werkzeug já possui uma função de 'recarga automática' disponível que pode ser ativada seguindo um destes procedimentos:

app.run(debug=True)

ou

app.debug = True

Você também pode usar um arquivo de configuração separado para gerenciar toda a sua instalação, se necessário. Por exemplo, eu uso 'settings.py' com uma opção 'DEBUG = True'. A importação deste arquivo também é fácil;

app.config.from_object('application.settings')

No entanto, isso não é adequado para um ambiente de produção.

Ambiente de produção

Pessoalmente, escolhi o Nginx + uWSGI em vez do Apache + mod_wsgi por alguns motivos de desempenho, mas também pelas opções de configuração. O toque-recarregar opção permite especificar um arquivo / pasta que fará com que o aplicativo uWSGI recarregue seu aplicativo de balão recém-implantado.

Por exemplo, seu script de atualização baixa as alterações mais recentes e toca no arquivo 'reload_me.txt'. Seu script uWSGI ini (que é mantido pela Supervisord - obviamente) tem esta linha em algum lugar:

touch-reload = '/opt/virtual_environments/application/reload_me.txt'

Eu espero que isso ajude!

Ewan
fonte
1
Obrigado pela ótima dica. Eu simplifiquei um pouco. Crie um script bash que se toque quando executado. Assim, você só precisa iniciá-lo quando quiser recarregar. Minha solução: # touch_me_and_reload.sh touch $ 0
Jabba
@Ewan. onde deve estar a linha de recarga de toque? a seção [program: uwsig] ou a seção [supervisord]?
usar o seguinte comando
@ user805981- nem um .iniarquivo de configuração uwsgi separado . Se você ler a documentação sobre "touch-reload", ela está na configuração uWSGI, não supervisor.
Ewan
Obrigado por isso. app.run(debug=True)falha, mas a configuração da variável ambiental funciona.
Ari
23

Se você estiver usando o uwsgi, consulte a opção de recarregamento automático do python:

uwsgi --py-autoreload 1

Exemplo uwsgi-dev-example.ini:

[uwsgi]
socket = 127.0.0.1:5000
master = true
virtualenv = /Users/xxxx/.virtualenvs/sites_env
chdir = /Users/xxx/site_root
module = site_module:register_debug_server()
callable = app
uid = myuser
chmod-socket = 660
log-date = true
workers = 1
py-autoreload = 1

site_root / __ init__.py

def register_debug_server():
    from werkzeug.debug import DebuggedApplication

    app = Flask(__name__)
    app.debug = True
    app = DebuggedApplication(app, evalex=True)
    return app

Então corra:

uwsgi --ini uwsgi-dev-example.ini

Nota: Este exemplo também habilita o depurador.

Eu segui esse caminho para imitar a produção o mais próximo possível da minha configuração do nginx. Simplesmente executando o aplicativo de balão com o servidor da Web embutido atrás do nginx, resultaria em um erro de gateway incorreto.

Kyle James Walker
fonte
16

Algumas atualizações para o Flask 1.0 e superior

a abordagem básica para recarregar a quente é:

$ export FLASK_APP=my_application
$ export FLASK_ENV=development
$ flask run
  • você deve usar FLASK_ENV=development(não FLASK_DEBUG=1)
  • como verificação de segurança, você pode executar flask run --debugger apenas para garantir que esteja ligado
  • a CLI do Flask agora lerá automaticamente coisas como FLASK_APPe FLASK_ENVse você tiver um .envarquivo na raiz do projeto e tiver o python-dotenv instalado
Zach Valenta
fonte
export FLASK_ENV=developmenttrabalhou para mim. app.run(debug=True)parece não funcionar.
14289 alex
3

Eu tive uma ideia diferente:

Primeiro:

pip install python-dotenv

Instale o python-dotenvmódulo, que lerá a preferência local para o seu ambiente de projeto.

Segundo:

Adicione um .flaskenvarquivo ao diretório do projeto. Adicione o seguinte código:

FLASK_ENV=development

Está feito!

Com esta configuração para o seu projeto Flask, quando você executar flask rune você verá esta saída no seu terminal:

insira a descrição da imagem aqui

E quando você editar seu arquivo, salve a alteração. Você verá que o recarregamento automático existe para você:

insira a descrição da imagem aqui

Com mais explicações:

Claro que você pode bater manualmente export FLASK_ENV=developmentsempre que precisar. Mas usar um arquivo de configuração diferente para lidar com o ambiente de trabalho real parece ser uma solução melhor, por isso recomendo fortemente esse método que uso.

Anthonyeef
fonte
Perfeito! Além disso, não esqueça de incluir a FLASK_APPvariável no .flaskenvarquivo.
Cequiel
2

Aplicativos de balão podem opcionalmente ser executados no modo de depuração. Nesse modo, dois módulos muito convenientes do servidor de desenvolvimento chamados reloader e debugger são ativados por padrão. Quando o recarregador está ativado, o Flask observa todos os arquivos de código fonte do seu projeto e reinicia automaticamente o servidor quando qualquer um dos arquivos é modificado.

Por padrão, o modo de depuração está desativado. Para habilitá-lo, defina uma FLASK_DEBUG=1variável de ambiente antes de chamar o balão run:

(venv) $ export FLASK_APP=hello.py for Windows use > set FLASK_APP=hello.py

(venv) $ export FLASK_DEBUG=1 for Windows use > set FLASK_DEBUG=1

(venv) $ flask run

* Serving Flask app "hello"
* Forcing debug mode on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 273-181-528

Ter um servidor em execução com o recarregador ativado é extremamente útil durante o desenvolvimento, porque toda vez que você modifica e salva um arquivo de origem, o servidor é reiniciado automaticamente e recebe a alteração.

Asim Fakhi
fonte
1

Para conseguir isso no PyCharm, defina a seção 'Variáveis ​​de ambiente' como:

PYTHONUNBUFFERED=1;
FLASK_DEBUG=1

Para o Flask 'configurações de execução / depuração'.

céu azul
fonte
Para usuários do PyCharm Pro, você pode configurar uma configuração de depuração separada
Ty Hitzeman
0

$ env: Flask_ENV = "MyAPP.py"

$ env: Flask_ENV = "desenvolvimento"

corrida de balão

Deve ser trabalhado

LiQiang
fonte