使用python cgi的空浏览器屏幕

使用python cgi的空浏览器屏幕,python,cgi,real-time,flush,Python,Cgi,Real Time,Flush,我需要在图形中实时显示动态数据。 所以我需要用每秒更新的数据绘制一个新的图表 问题是我无法在浏览器中清空以前的输出 因此,我们不需要得到一个包含更新数据的简单图表 我有很多图表 这是代码。目前它有随机数据 def graph(data): X,Y = 500, 275 #image width and height img = Image.new("RGB", (X,Y), "#FFFFFF") draw = ImageDraw.Draw(img) #draw

我需要在图形中实时显示动态数据。 所以我需要用每秒更新的数据绘制一个新的图表

问题是我无法在浏览器中清空以前的输出 因此,我们不需要得到一个包含更新数据的简单图表 我有很多图表

这是代码。目前它有随机数据

def graph(data):
    X,Y = 500, 275 #image width and height
    img = Image.new("RGB", (X,Y), "#FFFFFF")
    draw = ImageDraw.Draw(img)

    #draw some axes and markers
    for i in range(X/10):
        draw.line((i*10+30, Y-15, i*10+30, 20), fill="#DDD")
        if i % 5 == 0:
            draw.text((i*10+15, Y-15), `i*10`, fill="#000")
    for j in range(1,Y/10-2):
        draw.text((0,Y-15-j*10), `j*10`, fill="#000")
    draw.line((20,Y-19,X,Y-19), fill="#000")
    draw.line((19,20,19,Y-18), fill="#000")

    for i in range(1,len(data)):
        draw.line((i+20,Y-20,i+20,Y-20-data[i]), fill="#000")

    rtime = str(time.time())
    img.save("../images/out.png"+rtime, "PNG")

    htmlBody = []
    htmlBody.insert(0, 'Content-type: text/html; charset=UTF-8\n') 
    htmlBody.append('<html>')    
    htmlBody.append('<body>')    
    htmlBody.append('<img src=\"../images/out.png'+rtime+'\" alt=\"\" />')

    htmlBody.append("</body>")
    htmlBody.append('</html>')  
    sys.stdout.flush()
    sys.stdout.write('\n'.join(htmlBody))
    sys.stdout.flush()





data = []
if (printgraph!=None):
    sys.stdout = sys.stderr = oldsysout
    for i in range(1,5):
        data.append(int(250*(random.random())))
        graph(data)
        sys.stdout.flush()
        time.sleep(1)
    exit()
def图(数据):
十、 Y=500275#图像宽度和高度
img=Image.new(“RGB”,(X,Y),“#FFFFFF”)
draw=ImageDraw.draw(img)
#画一些轴和标记
对于范围内的i(X/10):
绘制线((i*10+30,Y-15,i*10+30,20),填充=“#DDD”)
如果i%5==0:
draw.text((i*10+15,Y-15),'i*10',fill=“#000”)
对于范围(1,Y/10-2)内的j:
draw.text((0,Y-15-j*10),`j*10',fill=“#000”)
绘制线((20,Y-19,X,Y-19),填充=“#000”)
绘制线((19,20,19,Y-18),填充=“#000”)
对于范围(1,len(数据))中的i:
绘制线((i+20,Y-20,i+20,Y-20-data[i]),填充=“#000”)
rtime=str(time.time())
img.save(“../images/out.png”+rtime,“png”)
htmlBody=[]
htmlBody.insert(0,'内容类型:text/html;字符集=UTF-8\n')
htmlBody.append(“”)
htmlBody.append(“”)
htmlBody.append(“”)
htmlBody.append(“”)
htmlBody.append(“”)
sys.stdout.flush()
sys.stdout.write('\n'.join(htmlBody))
sys.stdout.flush()
数据=[]
如果(printgraph!=无):
sys.stdout=sys.stderr=oldsysout
对于范围(1,5)内的i:
data.append(int(250*(random.random()))
图表(数据)
sys.stdout.flush()
时间。睡眠(1)
退出()

我将创建一个单独的CGI脚本来创建图像。然后可以在图像标记中引用新脚本
src=“makepic.py”


下面介绍如何使Python脚本服务于动态图像。在页面上,您可以使用JavaScript的
settimeout
刷新图像。

您可以考虑一个带有HTTP“refresh”标题的页面。标题的内容应该是由分号分隔的两个项目。第一个是2(刷新后的秒数),第二个是页面的URL(因为您希望重复内容)。如果需要,您还可以使用META标记从页面内容中插入一个伪标题

不幸的是,这将意味着对后端进行一些重新组织,因为页面现在必须在每次调用时提供计算当前状态的表示。这并不一定容易

要创建一个页面,服务器可以随时“推送”新内容,您需要做一些编程。考虑传递一个脚本,将DIV的内层HTML属性设置为下一个图表的HTML,而不是仅仅传递纯HTML。然后让您的页面请求此内容。这样做的另一个好处是,页面不会在每次交付新图形时完全刷新