Ошибка импорта внешней библиотеки в библиотеке тегов шаблонов 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.

Другие вопросы по тегам