Создание веб-приложения в flask, генерация нового html-файла в каждом запросе, но flask возвращает предыдущий

#python #html #flask #bokeh

#python #HTML #flask #боке

Вопрос:

Я пытаюсь создать веб-приложение в flask, и в одной из функций, когда вы отправляете форму, Bokeh генерирует HTML-файл, который включает в себя график.

Проблема в том, что как только вы отправляете форму, отображается первая, и все работает гладко, но когда вы нажимаете кнопку назад или возвращаетесь на домашнюю страницу, вы отправляете другую форму с новой информацией, вы все равно увидите первый график.

Я сузил проблему до этой строки

def plot(): возвращает render_template(«stocks.html «)

итак, когда я проверяю в папке templates новый HTML-файл, включающий новый график с новой информацией о запросе, есть, но flask отображает предыдущий .html

 import os
import numpy as np
import requests

import pandas as pd
from bokeh.plotting import figure, output_file, save
from flask import Flask,render_template,request,redirect, url_for
import datetime



app_STMilestone = Flask(__name__)



colors = ["navy", "green", "purple", "red"]
prTypes = ["Adj_Open","Adj_High", "Adj_Low", "Adj_Close"]
cmdict={}
cmdict["HD"] = "Home Depot"
cmdict["DIS"] = "The Walt Disney Company"
cmdict["MSFT"]="Microsoft Corporation"
cmdict["BA"]="The Boeing Company" 

os.environ["API.i"] = "https://www.quandl.com/api/v3/datasets/EOD/"
os.environ["API.ii"] = "?start_date="
os.environ["API.iii"] = "amp;end_date="
os.environ["API.iv"] = "amp;api_key=<snip>"



@app_STMilestone.route("/",methods=["GET","POST"])
def index_lulu():
    stocks ={}
    prtype =[]
    if request.method == "GET":

        return render_template("Page1.html")

    else:
        Company = request.form.get("Company")
        stDate = request.form.get("stdate")
        endDate = request.form.get("enddate")


        for i in prTypes:
            if request.form.__contains__(i):
                prtype.append(request.form.get(i))





        stDate = datetime.datetime.strptime(stDate,"%Y-%m-%d").strftime("%Y-%m-%d")
        endDate = datetime.datetime.strptime(endDate,"%Y-%m-%d").strftime("%Y-%m-%d")

        if stDate >= endDate :
            return redirect("/error")
        else:
            r = requests.get(os.environ["API.i"] Company os.environ["API.ii"] stDate os.environ["API.iii"] endDate os.environ["API.iv"])
            data =r.json() 
            db = pd.DataFrame(data["dataset"]["data"], columns=data["dataset"]["column_names"])


            # prepare some data
            for i in prtype:
                stocks[i] = np.array(db[i])


            dates = np.array(db['Date'], dtype=np.datetime64)



            # output to static HTML file
            output_file("templates/stocks.html", title="stocks")

            # create a new plot with a a datetime axis type
            p = figure(plot_width=800, plot_height=350, x_axis_type="datetime")

            # add renderers
            j=0
            for i in prtype:
                if j > 3 : 
                    j = 0
                p.line(dates, stocks[i], color=colors[j], legend=i)
                j =1

            # NEW: customize by setting attributes
            p.title.text = cmdict[Company] " stock prices From " stDate  " to " endDate 
            p.legend.location = "top_left"
            p.grid.grid_line_alpha = 0
            p.xaxis.axis_label = 'Date'
            p.yaxis.axis_label = 'Price'
            p.ygrid.band_fill_color = "olive"
            p.ygrid.band_fill_alpha = 0.1
            save(p)
            return redirect(url_for("plot"))



@app_STMilestone.route("/plot")
def plot():
    return render_template("stocks.html")



@app_STMilestone.route("/error", methods=["GET","POST"])
def error():
    if request.method == "GET":
        return render_template("error.html")
    else:
        return redirect("/")



if __name__ == "__main__":
    app_STMilestone.run(debug=False)
  

Комментарии:

1. Попробуйте очистить кэш, файлы cookie для вашего браузера и повторить попытку.

2. @amanb уже не работал. Я думаю, что это ошибка flask. Я обошел это, внедрив график в свой собственный html-шаблон

3. Попробуйте сузить проблему, заменив вызовы API локальными фиктивными данными, затем преобразуйте и минимизируйте свой код, чтобы его могли запускать другие, которые могут вам помочь. Спасибо!