0

我正在尝试在 Django 下提供静态文件(HTML + CSS)。(稍后,我将使用密码保护它们)。但是,我得到了错误的内容类型。HTML 文件被下载,而不是显示。

我的网络服务器是 Apache,我在 Webfaction 下运行它。我正在查看 Chromium 18 下的站点。

我正在尝试一种简单的 FileWrapper(从 Django 发送文件)方法,我使用 mimetype 来确定类型,以及 x_modsendfile,我让网络服务器决定。

HTML 文件被下载,而不是显示。

当我通过我的 Apache 网络服务器而不是 Django 提供服务时,内容标题应该是这样的:

HTTP/1.1 200 OK => 
Server => nginx
Date => Wed, 19 Sep 2012 21:51:35 GMT
Content-Type => text/html
Content-Length => 9362
Connection => close
Vary => Accept-Encoding
Last-Modified => Wed, 19 Sep 2012 05:53:00 GMT
ETag => "e3a0c43-2492-4ca079e8fea23"
Accept-Ranges => bytes

观察服务器声称是 nginx。Webfaction 说它为静态服务设置了 Apache,事实上我一直在为 Django 配置一个 Apache 服务器。但是响应说 Nginx (!)

这是来自天真的 FileWrapper 实现的响应,其中我使用 mimetypes 选择 Content-Type:

HTTP/1.1 200 OK => 
Server => nginx
Date => Wed, 19 Sep 2012 21:53:28 GMT
Content-Type => ('text/html', none)
Content-Length => 9362
Connection => close

内容类型是一个 TUPLE。

这是 mod_xsendfile 实现的响应,其中我没有选择 Content-Type:

HTTP/1.1 200 OK => 
Server => nginx
Date => Wed, 19 Sep 2012 21:52:40 GMT
Content-Type => text/plain
Content-Length => 9362
Connection => close
Vary => Accept-Encoding
Last-Modified => Wed, 19 Sep 2012 05:53:00 GMT
ETag => "e3a0c43-2492-4ca079e8fea23"

这是我的代码:

def _serve_file_xsendfile(abs_filename):
    response = django.http.HttpResponse() # 200 OK
    del response['content-type'] # We'll let the web server guess this.
    response['X-Sendfile'] = abs_filename
    return response

def _serve_file_filewrapper(abs_filename):
    p_filename = abs_filename
    if not os.path.exists(p_filename):
        raise Exception('File %s does not exist!')

    try:
        _content_type = mimetypes.guess_type(p_filename)
    except:
        _content_type = 'application/octet-stream'

    print p_filename, _content_type

    wrapper = FileWrapper(file(p_filename))
    response = HttpResponse(wrapper, content_type=_content_type)
    response['Content-Length'] = os.path.getsize(p_filename)
    response['Content-Type'] = _content_type
    return response

def _serve_file(filename):
    abs_filename = _get_absolute_filename(filename)
    return _serve_file_filewrapper(abs_filename)

def public_files(request, filename):
    return _serve_file(filename)

对于 FileWrapper 或 mod_xsendfile 方法,如何获得正确的 Content-Type?

4

1 回答 1

0

_content_type = mimetypes.guess_type(p_filename)

应该

_content_type, encoding = mimetypes.guess_type(p_filename)

于 2012-09-21T07:54:34.513 回答