【问题标题】:Using ETag in feedparser在 feedparser 中使用 ETag
【发布时间】:2014-05-09 09:06:45
【问题描述】:

我正在编写一个 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 并将其用于所有其他用户吗?是否每个用户都有一个线程,因此我不能以这种方式共享变量的值?

【问题讨论】:

  • Eduard,你大大改变了你的问题,首先你问etag有什么用,如果你第一次不能使用它,你得到了答案。现在您在问,如何为所有用户保留一些状态信息。您将创建新问题。

标签: python django feedparser


【解决方案1】:

Etag 允许标记网络资源的唯一状态,以便您有机会请求表示您已经拥有的最新状态的资源。

但是如果你的客户端已经有某个版本,你必须第一次获取它,所以第一个请求是使用etag无关的。

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

典型场景是:

  1. 第一次获取您的页面并读取 Etag 标头的值以供将来使用
  2. 下次您请求同一页面时,您添加标题If-None-Match,其值为您上次提取的 Etag。服务器会检查,如果有新的东西,如果你提供的 Etag 和当前版本资源的 Etag 相同,它不会返回完整的页面,而是返回 HTTP 状态码304 Not Modified。如果页面在服务器上具有不同的状态,您将获得具有 HTTP 状态代码 200 和响应标头中 Etag 的新值的页面。

如果您想优化您的应用程序以不为每个用户生成相同提要的初始请求,您应该以某种方式在您的应用程序中全局共享给定资源的 Etag 值。

【讨论】:

  • 您好,我在阅读您的回答后更新了关于“第一次”的部分。
【解决方案2】:

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

如果您的提要是公共提要,则中间缓存代理也可以为非条件请求返回 ETagged 结果,但如果条件标头不匹配,它始终必须联系源服务器。

【讨论】:

  • 您好,我在阅读您的回答后更新了问题描述
  • 允许源服务器缓存 ETagged 结果,就像中间缓存代理所做的那样。这通常可以通过让服务器将预渲染结果存储在 Redis/memcached/RDBMS 或类似的东西中来完成。
猜你喜欢
  • 1970-01-01
  • 2020-11-18
  • 1970-01-01
  • 2015-09-03
  • 1970-01-01
  • 1970-01-01
  • 2020-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多