2011-08-22 73 views
2

我需要从外部网站抓取四个html片段,并将它们显示在我的django网站的页眉和页脚中。我肯定需要将这些缓存一段时间。读取和缓存Django模板上使用的html片段

我最初的想法是使用urllib2来读取http,然后将html文件写入我的服务器。通过Django上下文处理器实现,代码检查四个文件的时间戳,并在必要时检索更新的版本,然后将它们读入模板变量。

我似乎正在为Django的四个文件之一的模板变量大小最大化。这迫使我使用readlines()并将该文件作为数组传递给模板。

是否有更优雅的方式从外部网站检索四个html片段,缓存它们并将它们传递给我的模板?

这里就是我的base.html文件模板看起来像现在:

{{ integration_prehead|safe }} 
<head> 
{{integration_head|safe }} 
... 
</head> 
{% for l in integration_topper %}{{ l|safe }}{% endfor %} 
{{ block content }}{{ endblock content }} 
{{ integration_footer|safe }} 

的prehead.html没有太大的比DOCTYPE开放HTML标记的任何其他。 head.html是一堆javascript和样式表。 topper.html和footer.html是最大的部分,它们是页面的顶部和底部。特别是topper可以每15分钟更改一次,所以在我的模板上进行硬编码是不现实的。

礼帽是39k和太大,不能读入单个Django模板变量,因此for循环。

+0

Html片段不是您的网站的一部分。如何在内部模板系统的帮助下缓存外部html?你确定你的问题是正确的吗?请举例。 – sergzach

+0

不过有趣的是,+1。 – sergzach

+0

谢谢。我编辑了我的问题以提供一些额外的细节。 – wmfox3

回答

0

如果你有任何控制服务器的东西,你最好的办法是设置专门的视图,只返回片段而不是整个HTML文档。

然后,您可以使用Django视图手动将片段保存到磁盘或使用Django's Cache framework。缓存框架将更加健壮,并提供额外的存储方式,例如通过数据库或memcached,但不能保证在限定的时间段内存储片段。例如,如果服务器必须重新启动,memcached将会丢失所有内容。

如果源服务器不在您的控制范围内,我强烈建议您先通过HTML解析器运行文档,然后将其拉出并仅将您需要的部分传递给模板。 BeautifulSoup是一个很好的python。

+0

谢谢,克里斯。外部服务器将html文档分为四个组件。我在上面的问题中添加了一些额外的说明。我喜欢使用Django视图和Django的Cache框架。你是否提出了四个调用片段并缓存它们的视图?由于这些在我的网站的每个页面都需要,这四个视图将如何配合? – wmfox3