在feedparser中使用ETag
我正在写一个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)
我想避免每个使用这个网页应用的用户都去请求一次数据。也许ETag不是最好的选择?一旦第一个用户看到这个视图,我能否存储这个ETag,然后让其他用户也用这个?每个用户都有自己的线程,这样我就不能以这种方式共享一个变量的值吗?
2 个回答
0
第一次请求时,客户端是无法使用任何本地缓存的,所以在第一次请求中,ETag(实体标签)并不是必须的。要记住,ETag需要放在条件请求的头信息里(比如If-None-Match、If-Match等),而非条件请求的意思是很明确的。
如果你的数据源是公开的,那么中间的缓存代理也可以在非条件请求中返回带有ETag的结果,尽管如果条件头信息不匹配,它仍然需要联系原始服务器。
1
Etag 是一种标记网页资源独特状态的方式,这样你就可以请求这个资源,并表明你已经拥有的最新状态。
不过,要在你的客户端上有某个版本的资源,你得先获取一次,所以第一次请求时,etag
的使用并不重要。
你可以查看 维基百科上的 HTTP Etag,那里解释得很清楚。
通常的场景是:
- 第一次获取你的网页,并读取 Etag 头的值,以便将来使用。
- 下次你请求同样的网页时,你会在请求中添加一个头信息
If-None-Match
,其值就是你上次获取的 Etag。服务器会检查一下,如果没有新内容,且你提供的 Etag 和当前资源的 Etag 一样,它就不会返回完整的网页,而是返回 HTTP 状态码304 Not Modified
。如果服务器上的页面状态不同,你会收到带有 HTTP 状态码 200 的页面,并在响应头中看到新的 Etag 值。
如果你想优化你的应用,避免每个用户都生成对同一个资源的初始请求,你需要在应用中以某种方式共享这个资源的 Etag 值。