0

Django で静的ファイル (HTML + CSS) を提供しようとしています。(後で、パスワードで保護します)。ただし、間違ったコンテンツ タイプを取得しています。HTML ファイルはダウンロードされますが、表示されません。

私の Web サーバーは Apache で、これを Webfaction で実行しています。Chromium 18 の下のサイトを見ています。

mimetype を使用してタイプを決定する単純な FileWrapper (Django からファイルを送信する) アプローチと、Web サーバーに決定させる x_modsendfile の両方を試しています。

HTML ファイルはダウンロードされますが、表示されません。

DjangoではなくApache Webサーバーを介してサービスを提供する場合、コンテンツヘッダーは次のようになります。

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 実装からの応答です。ここでは、MIME タイプを使用して 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

content-type は 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 に答える