Render, mudando dinamicamente imagens com os mesmos nomes de arquivos em Flask

votos
5

I têm uma função de visualização de balão como a seguir:

@app.route('/myfunc', methods = ['POST', 'GET'])
def myfunc():
    var = request.form[samplename]
    selected_ecg=ecg.loc[ecg['Patient ID'].isin([var])]
    selected_ecg = selected_ecg.drop('Patient ID', 1)
    arr = np.array(selected_ecg)
    y = arr.T
    x=np.array(range(1,189))
    plot.plot(x,y)

    #Remove the old file
    os.remove(static\graph.png)
    #Now save the new image file
    plot.savefig(static\graph.png)

    return render_template(outputs.html)

Outputs.html:

<html>
  <head>

  </head>
   <body>
     <h1>Output page</h1>

      <img src=static/graph.png />

   </body>

</html>

Eu uso a função de visualização frasco para exibir uma imagem através do arquivo outputs.html. O problema aqui é que o arquivo de imagem estática que é servido mantém mudando a cada momento com base em entradas do usuário. Em outras palavras, eu continuo substituindo o arquivo de imagem com base nas entradas que o usuário selecionou.

Mas o problema é que o arquivo de imagem mudando não é servido. O arquivo de imagem antigo que foi utilizado pela primeira vez rende só é exibido para cada nova entrada do usuário.

Eu já referido posts antigos sobre servindo conteúdo dinâmico no frasco. Mas nenhum deles serviu útil.

Publicado 08/11/2018 em 06:41
fonte usuário
Em outras línguas...                            


2 respostas

votos
3

thebjorn solução 's é válido. Eu encontrei vários posts sobre estouro de pilha que sugerem soluções idênticas. Para visualizá-los, procurar how to not cache imagesno Google. ligação link2 link3

Abaixo está a minha solução para o seu problema. Isto irá apagar o arquivo gráfico e criar um novo com plot.savefig em cada solicitação GET para / myfunc . Eu não tinha certeza sobre o que solicitar que você queria esse comportamento.

@app.route('/myfunc', methods = ['POST', 'GET'])
def myfunc():
    var = request.form["samplename"]
    selected_ecg=ecg.loc[ecg['Patient ID'].isin([var])]
    selected_ecg = selected_ecg.drop('Patient ID', 1)
    arr = np.array(selected_ecg)
    y = arr.T
    x=np.array(range(1,189))
    plot.plot(x,y)

    new_graph_name = "graph" + str(time.time()) + ".png"

    for filename in os.listdir('static/'):
        if filename.startswith('graph_'):  # not to remove other images
            os.remove('static/' + filename)

    plot.savefig('static/' + new_graph_name)

    return render_template("outputs.html", graph=new_graph_name)

Outputs.html

<html>
  <head>

  </head>
   <body>
     <h1>Output page</h1>

      <img src="{{ url_for('static', filename=graph) }}" />

   </body>

</html>
Respondeu 08/11/2018 em 08:03
fonte usuário

votos
3

Você está correndo em um problema de cache. recursos estáticos, como imagens, são armazenados em cache em cada ponto da cadeia entre o servidor eo browser. Isto é uma coisa boa. A maioria dos sistemas razoáveis ​​são configurados para imagens de cache para pelo menos 1 ano no servidor (e que, se eles não estão em cache no navegador).

Para rebentar com esta questão cache, você precisa se quer (i) dar os arquivos novos nomes, (ii) reconfigurar Varyos cabeçalhos para indicar que eles não devem ser armazenadas em cache, ou (iii) adicionar um fragmento de singularidade - por exemplo, em vez de usar static/graph.png, adicionar um timestamp 'static/graph.png?v=' + (new Date()).valueOf()ou um hash MD5.

update: Dinko lhe deu uma resposta bem (não ler os links que ele oferece). Para adicionar cache-rebentando no lado do servidor, sem criar novos arquivos, você pode calcular uma soma de verificação md5 (desvantagem: você precisa ler o arquivo inteiro):

from hashlib import md5
fname = 'static/graph.png'
with open(fname, 'rb') as fp:
    checksum = md5.new(fp.read()).hexdigest()
fname += "?v" + checksum

ou usar a última modificação atributo (nem sempre confiável):

from hashlib import md5
fname = 'static/graph.png'
modified_tstamp = str(int(os.stat(fname).st_mtime * 10**6))
fname += "?v" + checksum

Ambos os métodos irá servir uma versão em cache, desde que o arquivo não muda.

Respondeu 08/11/2018 em 07:19
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more