Send a “304 Not Modified” for images stored in the datastore

前端 未结 4 2076
迷失自我
迷失自我 2021-02-04 20:43

I store user-uploaded images in the Google App Engine datastore as db.Blob, as proposed in the docs. I then serve those images on /images/.jpg

4条回答
  •  旧时难觅i
    2021-02-04 21:10

    Bloggart uses this technique. Have a look at this blog post.

    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)
    

提交回复
热议问题