在feedparser中使用ETag

时间:2014-05-09 09:06:45

标签: python django feedparser

我正在编写一个Django视图,其中包含wordpress系统的最新博客文章。

def __get_latest_blog_posts(rss_url, limit=4):
    feed = feedparser.parse(rss_url)
    return something

我在终端尝试使用ETags:

>>> import feedparser
>>> d = feedparser.parse("http://a real url")
>>> d.etag
u'"2ca34419a999eae486b5e9fddaa2b2b9"'
>>> d2 = feedparser.parse("http://a real url", d.etag)

我想避免为网络应用的每个用户请求Feed。也许etag不是最好的选择? 第一个用户看到此视图后,是否可以存储etag并将其用于所有其他用户?是否每个用户都有一个主题,因此我无法以这种方式分享变量的值?

2 个答案:

答案 0 :(得分:1)

Etag允许标记网络资源的唯一状态,以便您有机会询问表达您已有状态的资源。

但是要在您的客户端上安装一些版本,您必须在第一次获取它,因此对于第一个请求使用etag无关紧要。

请参阅HTTP Etag at wikipedia,它解释了一切。

典型情况是:

  1. 第一次获取您的页面并读取Etag标头的值以供将来使用
  2. 下次您要求使用同一页面时,您需要在上次提取时添加标头If-None-Match,其值为Etag。服务器将检查,如果有新内容,如果您提供的Etag和当前资源版本的Etag相同,它将不会返回完整页面,而是返回HTTP状态代码304 Not Modified。如果页面在服务器上具有不同的状态,则会在响应标头中显示HTTP状态代码为200且新值为Etag的页面。
  3. 如果您希望优化您的应用不要为每个用户生成相同Feed的初始请求,您应该以某种方式在应用程序中全局共享给定资源的Etag值。

答案 1 :(得分:0)

第一个请求客户端将永远无法使用任何本地缓存,因此在第一次请求时,ETag是不必要的。请记住,ETag需要传递到条件请求头(If-None-Match,If-Match等),非条件请求的语义是明确的。

如果您的Feed是公共Feed,那么中间缓存代理也可以返回非条件请求的ETagged结果,但如果条件标头不匹配,它将始终必须联系原始服务器。 / p>