有没有办法使用response.write
返回正确内容类型的文件(例如图片,脚本)?这就是我一直在使用的:
with open(path) as f:
self.response.write(f.read())
但是这会将内容类型设置为text/html
。或者response.write
不是正确的方法来解决这个问题吗?
答案 0 :(得分:2)
我在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。
答案 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)