我会展开,把我建站的时候遇到的困难一一道来。
SAE上的建议就是matplotlib绘图,图保存在StringIO中,然后从内存中拿出来用。于是绘图的过程如下:
buf = StringIO.StringIO()
fig.savefig(buf, format='png', transparent=True)
return buf
想要显示的话,就需要在GET方法中返回buf中的内容
class GeImage:
def GET(self):
self.buf = plot_object.plot()
self.buf.seek(0)
self.contents = self.buf.getvalue()
return self.contents
把url绑定到GeImage类中,点击url就可以看到图片了。
我的网站交互是这样的,在搜索框中输入名字,然后把名字传入后台,从数据库搜索数据,绘图,然后展示到网页中,而且图片是嵌入网页中的。如何把输入和输出 在类中传递着实伤透了脑筋,后来,我发现其实很简单。
首先就是搜索框中的内容传入template
class SearchForm:
def GET(self):
data = web.input()
self.name = data.search_form
return self.render.index(self.name)
然后再把名字通过template传入GeImage类中
<div class="content"><h3>$name的登录时间统计:</h3><img id="login_figure" src="/image?name=$name" alt="login time figure"><br></div>
web.py中?后面的数据会传入GET方法中。然后就可以到GeImage绘图了。
也可以这考虑,我把图表生成到image?name=***的链接中,然后从template中调用。只是图片是调用的时候才生成的。是不是很简单呢?
以下就是夹带私货了。首先是吐槽,SAE对python调试的支持实在是太差了。只有少数错误可以提醒,比如import错误,就连名称错了都不能提醒在哪一行。很多时候我只能一次一次提交代码,就这个简单的网站,我提交了接近400次。如果提交的太频繁,SAE的服务器经常会屏蔽掉我。
可以与之对比的是百度网盘,百度网盘的容量一下子提高到了1000G,然后大家纷纷把电视剧电影都下载到百度网盘中,这其中有着大量的重复内容,百度的付出其实比之前并不会多太多,但是用户这边的体验却上升到了好几个档次,我甚至都用它取代移动硬盘了。
把产品做好,可以大大提高用户体验的同时,成本却不会增加那么多。
做网站的时候,本来有很多的点要说的,但是太久远了,竟然也就忘记了。就这样吧。
源代码:https://github.com/gt11799/kanzhihu