Импорт модуля Python внутри пользовательских тегов шаблона Django

Я использую virtualenv с моей установкой Python Django.

Вот моя структура каталогов:

project/
    dev_environ/
        lib/
            python2.6/
                site-packages/
                    ...
                    django/
                    titlecase/   # <-- The titlecase module
                    PIL/
                    ...
        bin/
            ...
            python  # <-- Python
            ...
        include/

    django_project/
        localsite/
            templatetags/
                __init__.py
                smarttitle.py    # <-- My templatetag module
        foo_app/
        bar_app/
        settings.py
        manage.py

Если я запущу свою оболочку Django и попытаюсь импортировать titlecase, все будет в порядке, потому что titlecase находится в sys.path по адресу dev_environ/lib/python2.6/site-packages/titlecase.

$:django_project cwilcox$ ../dev_environ/bin/python manage.py shell
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> import titlecase  # <-- No Import Error!
>>> 

Я даже могу сделать import titlecase внутри моего файла settings.py без ошибок.

Однако, когда я пытаюсь import titlecase в моей библиотеке тегов шаблонов smarttitle.py, я получаю ImportError.

smarttitle.py выглядит следующим образом.

from django import template
from django.template.defaultfilters import stringfilter
register = template.Library()
from titlecase import titlecase as _to_titlecase

@register.filter
@stringfilter
def smarttitle(value):
    return _to_titlecase(value)
smarttitle.is_safe = True

Не только это, но я даже могу import titlecase внутри представления, которое отображает шаблон, который пытается {% load smarttitle %}, и ошибки нет.

Мой сервер разработки Django запускается с...

../dev_environ/bin/python manage.py runserver

Вкратце:

Я могу импортировать модуль titlecase куда угодно, кроме этой библиотеки шаблонных тегов, где он выдает ошибку ImportError! Что дает?! Любые идеи?


EDIT: я попытался сначала запустить source dev_environ/bin/activate, чтобы переключить мою оболочку env на мою virtualenv, но это не помогло - я все еще получаю ImportError внутри моего модуля templatetag. Я уже вызывал правильный двоичный файл Python вручную.


person Chris W.    schedule 16.03.2011    source источник
comment
Может быть глупый вопрос, но вы делаете «source dev_environ/bin/activate» или что-то подобное?   -  person user608133    schedule 16.03.2011
comment
Я не знаю, что такое source dev_environ/bin/activate. Похоже, я упускаю что-то важное. Я подумал, что все, что мне нужно будет сделать, когда я что-то установлю, это dev_environ/bin/pip install <module>.   -  person Chris W.    schedule 16.03.2011
comment
Запуск «source ‹virtualenv dir›/bin/activate» изменяет ваш $PATH так, чтобы он указывал на каталог virtualenv, а не на глобальную установку python на вашем компьютере. В терминале попробуйте запустить «source dev_environ/bin/activate», а затем «python manage.py runserver» — все должно работать правильно?   -  person user608133    schedule 16.03.2011
comment
@ user608 Хорошо, я посмотрел, что делает bin/activate. Похоже, что это просто изменяет вашу оболочку, я уже вызывал правильный bin/python напрямую, поэтому я не думаю, что это проблема (я отредактирую, чтобы сделать это более ясным).   -  person Chris W.    schedule 16.03.2011
comment
У меня точно такая же проблема.   -  person dyve    schedule 06.03.2012


Ответы (3)


Как указано в комментариях, вам необходимо активировать виртуальную среду, выполнив source bin/activate (или просто . bin/activate) перед запуском сервера разработки, даже если вы уже обращаетесь к нужному исполняемому файлу Python.

person Daniel Roseman    schedule 16.03.2011
comment
Как я уже сказал в моем недавнем редактировании внизу, даже когда я переключаюсь в среду разработки с помощью source bin/activate, изменений нет. Я по-прежнему НЕ получаю ошибок при импорте из Django manage.py shell, и я все еще ПОЛУЧАЮ ошибки при импорте из тегов шаблонов внутри сервера разработки, начинающегося с manage.py runserver. - person Chris W.; 17.03.2011
comment
Если это не проблема с вашим $PATH, то это может быть связано с тем, как устанавливается titlecase. У меня похожая проблема с PIL — «easy_install PIL» устанавливает его, но плохо (хотя, если я правильно помню, все еще импортируется в оболочку) — «pip install PIL» работает как шарм. - person user608133; 17.03.2011

Я знаю, что это слишком старо, но сегодня у меня похожая проблема.

Проблема, похоже, заключается в использовании одного и того же имени для приложения и модуля, поэтому при попытке импорта может произойти сбой при поиске нужного модуля или функции в неправильном месте.

Я рекомендую вам давать разные имена приложению или модулю django.

person neoKore    schedule 05.05.2015

Это не исправление, а просто чтобы установить, что мы смотрим на одну и ту же проблему/ошибку:

Если вы измените импорт в smarttitle.py на

from YOURPROJECT.titlecase import titlecase as _to_titlecase

он будет работать с «runserver», но не будет работать на производстве (в моем случае uwsgi/nginx)

person dyve    schedule 06.03.2012