Por padrão, ao executar o aplicativo Flask usando o servidor integrado ( Flask.run
), ele monitora seus arquivos Python e recarrega automaticamente o aplicativo se seu código mudar:
* Detected change in '/home/xion/hello-world/app.py', reloading
* Restarting with reloader
Infelizmente, isso parece funcionar apenas para arquivos * .py , e não consigo encontrar nenhuma maneira de estender essa funcionalidade a outros arquivos. Mais notavelmente, seria extremamente útil fazer o Flask reiniciar o aplicativo quando um modelo for alterado. Já perdi a conta de quantas vezes estava mexendo na marcação de modelos e ficando confuso por não ver nenhuma alteração, apenas para descobrir que o aplicativo ainda estava usando a versão antiga do modelo Jinja.
Então, existe uma maneira de ter os arquivos de monitoramento do Flask no diretório de modelos ou é necessário mergulhar no código-fonte do framework?
Editar : estou usando o Ubuntu 10.10. Não tentei isso em nenhuma outra plataforma realmente.
Após uma investigação mais aprofundada, descobri que as alterações nos modelos de fato são atualizadas em tempo real, sem recarregar o próprio aplicativo. No entanto, isso parece se aplicar apenas aos modelos que são passados para flask.render_template
.
Mas acontece que, em meu aplicativo, tenho muitos componentes parametrizados reutilizáveis que uso em modelos Jinja. Eles são implementados como programas {% macro %}
, residem em "módulos" dedicados e são {% import %}
editados em páginas reais. Tudo bom e SECO ... exceto que esses modelos importados aparentemente nunca são verificados quanto a modificações, já que eles não passam de forma render_template
alguma.
(Curiosamente, isso não acontece com modelos invocados {% extends %}
. Quanto a {% include %}
, não tenho ideia, pois realmente não os uso.)
Então, para finalizar, as raízes desse fenômeno parecem estar em algum lugar entre Jinja e Flask ou Werkzeug. Eu acho que pode justificar uma viagem ao bug tracker para qualquer um desses projetos :) Enquanto isso, aceitei o jd. é a resposta porque essa é a solução que eu realmente usei - e funciona perfeitamente.
Respostas:
Na minha experiência, os modelos nem precisam que o aplicativo seja reiniciado para ser atualizado, pois eles devem ser carregados do disco sempre que
render_template()
forem chamados. Talvez seus modelos sejam usados de forma diferente.Para recarregar seu aplicativo quando os modelos forem alterados (ou qualquer outro arquivo), você pode passar o
extra_files
argumento paraFlask().run()
, uma coleção de nomes de arquivos a serem observados: qualquer alteração nesses arquivos acionará o recarregador.Exemplo:
Veja aqui: http://werkzeug.pocoo.org/docs/0.10/serving/?highlight=run_simple#werkzeug.serving.run_simple
fonte
Flask.run
que leva aos documentos de Werkzeug. Mas esta opção em particular parece útil o suficiente para pelo menos ser mencionada na documentação do Flask.No such file or directory
, tente usar o caminho relativo como em:extra_dirs = ['./directory/to/watch',]
path
é, éos.path
. pensei que valia a pena mencionarflask run
partir da linha de comando?você pode usar
De http://flask.pocoo.org/docs/1.0/config/
fonte
app.config['TEMPLATES_AUTO_RELOAD'] = True
, e por algum motivo esperava ver o servidor reiniciar automaticamente quando um modelo fosse alterado, como acontece no modo de depuração. Ele não reinicia, mas atualiza o modelo que ele renderiza.Ao trabalhar com
jinja
modelos, você precisa definir alguns parâmetros. No meu caso com python3, resolvi com o seguinte código:fonte
Para mim funciona muito bem:
Veja mais em http://flask.pocoo.org/docs/1.0/config/
fonte
Na verdade, para mim
TEMPLATES_AUTO_RELOAD = True
não funciona (versão 0,12). Eu uso jinja2 e o que fiz:Criar função
before_request
Registre-o no aplicativo
É isso aí.
fonte
O que funcionou para mim foi apenas adicionar isto:
( retirado da resposta de @dikkini )
fonte
Usando a versão mais recente do Flask no Windows, usando o comando run e debug definido como true; O Flask não precisa ser redefinido para que as alterações nos modelos tenham efeito. Tente Shift + F5 (ou Shift mais o botão recarregar) para se certificar de que nada está sendo armazenado em cache.
fonte
Consulte http://flask.pocoo.org/docs/1.0/quickstart/ e use
FLASK_ENV=development
fonte
Atualizado em junho de 2019:
O frasco CLI é recomendado em vez de app.run () para executar um servidor de desenvolvimento, portanto, se quisermos usar o CLI, a solução aceita não pode ser usada.
Usar a versão de desenvolvimento do Flask (1.1) no momento em que este livro foi escrito nos permite definir uma variável de ambiente FLASK_RUN_EXTRA_FILES que efetivamente faz a mesma coisa que a resposta aceita.
Veja este problema do github .
Exemplo de uso:
no Linux. Para especificar vários arquivos extras, separe os caminhos de arquivo com dois pontos. , por exemplo
A CLI também suporta um
--extra-files
argumento do Flask 1.1.fonte
Os modelos são recarregados automaticamente, por que não
ctrl+f5
atualizar a página da web, pois os navegadores da web geralmente salvam o cache.fonte