对存储在数据存储区中的图像发送"304 Not Modified"

Emi*_*ien 5 python google-app-engine http httphandler

我将用户上传的图像存储在Google App Engine数据存储区中db.Blob,如文档中所建议的那样.然后,我将这些图像提供给/images/<id>.jpg.

服务器总是发送200 OK响应,这意味着浏览器必须多次下载相同的图像(==较慢),并且服务器必须多次发送相同的图像(==更昂贵).

由于大多数图像可能永远不会改变,我希望能够发送304 Not Modified回复.我正在考虑在用户上传时计算图片的某种哈希值,然后使用它来知道用户是否已经拥有此图像(可能将哈希发送为Etag?)

我找到了这个答案这个答案很好地解释了逻辑,但我有两个问题:

  1. 是否可以发送EtagGoogle App Engine?
  2. 有没有人实现过这样的逻辑,和/或有没有可用的代码片段?

jbo*_*chi 8

Bloggart使用这种技术.看看这篇博客文章.

class StaticContentHandler(webapp.RequestHandler):
  def output_content(self, content, serve=True):
    self.response.headers['Content-Type'] = content.content_type
    last_modified = content.last_modified.strftime(HTTP_DATE_FMT)
    self.response.headers['Last-Modified'] = last_modified
    self.response.headers['ETag'] = '"%s"' % (content.etag,)
    if serve:
      self.response.out.write(content.body)
    else:
      self.response.set_status(304)

  def get(self, path):
    content = get(path)
    if not content:
      self.error(404)
      return

    serve = True
    if 'If-Modified-Since' in self.request.headers:
      last_seen = datetime.datetime.strptime(
          self.request.headers['If-Modified-Since'],
          HTTP_DATE_FMT)
      if last_seen >= content.last_modified.replace(microsecond=0):
        serve = False
    if 'If-None-Match' in self.request.headers:
      etags = [x.strip('" ')
               for x in self.request.headers['If-None-Match'].split(',')]
      if content.etag in etags:
        serve = False
    self.output_content(content, serve)
Run Code Online (Sandbox Code Playgroud)