Ошибка импорта внешней библиотеки в библиотеке тегов шаблонов Django
Поэтому я пытаюсь написать приложение для многократного использования Django, которое предоставляет метод для отображения вашего твиттера на вашей странице. Я хорошо знаю, что это уже существует 20 раз. Это академическое упражнение.:)
Структура каталогов довольно проста:
myproject
|__ __init__.py
|__ manage.py
|__ settings.py
|__ myapp
|__ __init__.py
|__ admin.py
|__ conf
|__ __init__.py
|__ appsettings.py
|__ feedparser.py
|__ models.py
|__ templates
|__ __init__.py
|__ templatetags
|__ __init__.py
|__ twitterfeed.py
|__ views.py
|__ templates
|__ base.html
|__ urls.py
При запуске оболочки Django функции, определенные в twitterfeed.py, работают отлично. Я также считаю, что у меня есть теги шаблонов, правильно названные и зарегистрированные.
Как видите, я использую отличный универсальный анализатор каналов. Моя проблема не в самой UFP, а в невозможности вызова UFP при импорте библиотеки тегов шаблона. Когда я {% load twitterfeed %}
в base.py я получаю следующую ошибку:
'twitterfeed' не является допустимой библиотекой тегов: не удалось загрузить библиотеку шаблонов из django.templatetags.twitterfeed, нет модуля с именем feedparser
Я импортирую feedparser, используя следующую инструкцию:
import re, datetime, time, myapp.feedparser
Насколько я могу судить, это сообщение об ошибке немного обманчиво. Я думаю, что при загрузке библиотеки шаблонов происходит ImportError, и это интерпретация Django.
Можно ли каким-либо образом импортировать feedparser.py в мое повторно используемое приложение, не требуя от пользователей приложения размещать feedparser где-нибудь в своем PythonPath?
Спасибо!
2 ответа
Это похоже на одну из тех раздражающих проблем относительного пути - решено в Python 2.6 и выше (где вы можете сделать импорт.. Feedparser и т. Д.), Но часто немного сложнее в старых версиях. Один дешевый и веселый способ исправить это может быть просто переместить feedparser.py в ваш каталог templatetags, как брат в twitterfeed.py
Я решаю эту проблему (отправка библиотек, которые являются зависимостями для моего общего проекта) следующим образом. Сначала я создаю каталог "ext" в корне моего проекта (в вашем случае это будет myproject/ext
). Затем я помещаю зависимости, такие как feedparser, в этот каталог ext - myproject/ext/feedparser
Наконец, я изменяю свой сценарий manage.py, чтобы вставить каталог ext / в начало sys.path. Это означает, что оба ./manage.py runserver
а также ./manage.py shell
подберем правильный путь:
# manage.py
import os, sys
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'ext'))
# ... rest of manage.py
Я считаю, что это работает очень хорошо, если вы не хотите возиться с такими вещами, как virtualenvs. Когда вы развертываете свой проект, вы также должны убедиться, что путь правильный - я обычно решаю это, добавляя sys.path.insert
строка в начало моего файла mod_wsgi app.wsgi.