response.write但是对于内容类型正确的文件?

时间:2017-08-01 20:24:28

标签: python google-app-engine webapp2

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

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

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

2 个答案:

答案 0 :(得分:2)

我在Webob文档中找到an example using mimetypes(webapp2请求和响应为Webob Request/Response objects)。可以找到mimetypes上的文档heremimetypes是一个内置的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

答案 1 :(得分:1)

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

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)