Проблемы с содержимым с Django под Apache, со статическими файлами HTML + CSS?
Я пытаюсь обслуживать статические файлы (HTML + CSS) под Django. (Позже я буду защищать их паролем). Тем не менее, я получаю неправильный тип контента. Файлы 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, и я действительно настраивал сервер Apache для Django. Но ответ говорит Nginx (!)
Вот ответ от простой реализации FileWrapper, в котором я выбираю Content-Type, используя mimetypes:
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)
Как я могу получить правильный Content-Type для обслуживания FileWrapper или mod_xsendfile?
1 ответ
_content_type = mimetypes.guess_type(p_filename)
должно быть
_content_type, encoding = mimetypes.guess_type(p_filename)