Image

Listens: Фаэтон — [На небе и на земле #02] Ты была солнцем

Categories:

Страшная сказка про IPython

Обновил недавно python-xy. В его состав входит новый IPython второй версии. Запускаю веб-блокнот, стилей нет, неюзабельно. Смотрю в Developer Tools > Network. Стили присылаются, но Content-Type у них text/plain. Несмотря на rel="stylesheet" и type="text/css" у тэга link, браузер в такое не верит и признавать стили отказывается.

Сервер стартует на 8888 порту, по этой строке и начинаем поиски.

Находим один файл C:\Python27\Lib\site-packages\IPython\html\notebookapp.py. Этот порт слушает экземпляр httpserver.HTTPServer, первый аргумент конструктора которого обработчик запросов, экземпляр NotebookWebApplication. У этого класса в init_settings прописано static_handler_class = FileFindHandler, который, видимо, и обрабатывает запросы к статике. Идем в его скромное жилище в \html\base\handlers.py. Обнаруживаем, что сам он никаким криминалом не занимается, поручая это родителю tornado.web.StaticFileHandler. Тот выставляет заголовки в set_headers, используя для этого метод get_content_type. В нем написано:

mime_type, encoding = mimetypes.guess_type(self.absolute_path)

Библиотека mimetypes — стандартная библиотека питона. Становится душновато. Открываем IPython Qt Console, вбиваем

import mimetypes
mimetypes.guess_type('file.css')


Этот кусок кода радостно выдает ('text/plain', None).

Лезем в C:\Python27\Lib\mimetypes.py и наблюдаем 600 строк, причем в функции _default_mime_types словарь types_map содержит '.css': 'text/css'. В попытках выяснить, откуда все же берется странный text/plain находим всякие чтения файлов и add_type. Можно было дотрейсить честно, но мне повезло и я увидел метод MimeTypes.read_windows_registry. Он проверяет в реестре значения вида HKCR\.css\Content Type и меняет свою базу на прочитанное. Теряюсь в догадках, какая гениальная программа оставила там у меня text/plain, но у этого парня, похоже, вылезла та же проблема. Исправляем реестр, все работает.


Другие страшные сказки читайте здесь: Как завести игрушку?, Чиним ljArchive, Графический дебаг, История одного Tray Balloon, MFC и майонез.