假设我有一个简单的视图,需要解析来自外部网站的数据.
现在它看起来像这样:
def index(request): source = urllib2.urlopen(EXTERNAL_WEBSITE_URL) bs = BeautifulSoup.BeautifulSoup(source.read()) finalList = [] # do whatever with bs to populate the list return render_to_response('someTemplate.html', {'finalList': finalList})
首先,这是否可以接受?
显然,这在性能方面并不好.外部网站页面非常大,我只提取了一小部分内容.我想到了两个解决方案:
以异步方式完成所有这些操作.加载页面的其余部分,一旦我得到它就填充数据.但我甚至不知道从哪里开始.我刚开始使用Django并且从未做过任何异步直到现在.
我不在乎这个数据是否每2-3分钟更新一次,因此缓存也是一个很好的解决方案(也节省了额外的往返次数).我该如何缓存这些数据?
S.Lott.. 5
首先,不要过早优化.让它工作.
然后,添加足够的日志记录以查看性能问题(如果有)确实存在.
您可能会发现最终用户的PC是最慢的部分; 实际上,当您不在浏览器中获取.JS库和.CSS以及艺术品和渲染时,从其他站点获取数据可能会非常快.
一旦你完全确定获取远程内容确实是一个问题.真.然后你必须做以下事情.
编写一个"crontab"脚本,不时地执行远程提取表单.
设计一个缓存远程结果的地方.数据库或文件系统,选择一个.
更新您的Django应用程序以从缓存(数据库或文件系统)而不是远程URL获取数据.
只有在您有绝对证据证明urllib2读取远程站点是瓶颈之后.
首先,不要过早优化.让它工作.
然后,添加足够的日志记录以查看性能问题(如果有)确实存在.
您可能会发现最终用户的PC是最慢的部分; 实际上,当您不在浏览器中获取.JS库和.CSS以及艺术品和渲染时,从其他站点获取数据可能会非常快.
一旦你完全确定获取远程内容确实是一个问题.真.然后你必须做以下事情.
编写一个"crontab"脚本,不时地执行远程提取表单.
设计一个缓存远程结果的地方.数据库或文件系统,选择一个.
更新您的Django应用程序以从缓存(数据库或文件系统)而不是远程URL获取数据.
只有在您有绝对证据证明urllib2读取远程站点是瓶颈之后.