2012-09-19 78 views
0

我想在Django下面提供靜態文件(HTML + CSS)。 (稍後,我會密碼保護他們)。但是,我收到了錯誤的內容類型。 HTML文件被下載,不顯示。Apache下的Django帶有靜態HTML + CSS文件的內容類型問題?

我的網絡服務器是Apache,我在Webfaction下運行它。我在Chromium 18下查看該網站。

我正在嘗試一個天真的FileWrapper(從Django發送文件)方法,其中我使用mimetype來確定類型,以及x_modsendfile,我讓Web服務器決定。

下載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執行的響應,其中我選擇使用MIME類型的內容類型(!):

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 

的內容類型是一個元組。

下面是從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方法提供類型?

回答

0

_content_type = mimetypes.guess_type(p_filename)

應該

_content_type, encoding = mimetypes.guess_type(p_filename)

+0

或本:_content_type = mimetypes.guess_type(p_filename)[0]考慮到你不需要編碼... –