【问题标题】:response.write but for files with correct content-type?response.write 但对于内容类型正确的文件?
【发布时间】:2017-08-01 20:24:28
【问题描述】:

有没有办法使用response.write 返回具有正确内容类型的文件(例如图像、脚本)?这是我一直在使用的:

with open(path) as f:
    self.response.write(f.read())

但这会将内容类型设置为text/html。或者response.write 不是解决这个问题的正确方法?

【问题讨论】:

    标签: python google-app-engine webapp2


    【解决方案1】:

    我在 Webob 文档中找到了 an example using mimetypes(webapp2 请求和响应为 Webob Request/Response objects)。 mimetypes 上的文档可以在 here 找到。 mimetypes 是一个内置的 python 模块映射文件扩展名到 MIME 类型。

    我找到的例子包括这个函数:

    import mimetypes
    def get_mimetype(filename):
        type, encoding = mimetypes.guess_type(filename)
        # We'll ignore encoding, even though we shouldn't really
        return type or 'application/octet-stream'
    

    您可以像这样在处理程序中使用该函数:

    def FileHandler(webapp2.RequestHandler):
        # I'm going to assume `path` is a route arg
        def get(self, path):
            # set content_type
            self.response.content_type = get_mimetype(path)
            with open(path) as f:
                 self.response.write(f.read())
    

    注意:正如@Dan Cornilescu 指出的那样,使用python-magic 而不是mimetypes 也可以,并且可能值得研究。他链接到this SO answer

    【讨论】:

      【解决方案2】:

      尝试将内容类型添加到标题中:

      my_file = f.read()
      content_type = my_file.headers.get('Content-Type', 'text/html')
      
      self.response.headers.add_header("Content-Type",content_type)
      self.response.write(my_file)
      

      【讨论】:

      • 问题是代码可能不知道内容类型可能是什么。
      • 已编辑答案。但是,正如 Dan 所说,Python Magic 应该可以解决问题。
      猜你喜欢
      • 2012-10-15
      • 2013-03-15
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 2012-10-27
      • 2011-02-25
      • 2015-05-22
      相关资源
      最近更新 更多