2009-07-26 2 views
3

Итак, я пытаюсь написать приложение для повторного использования Django, которое предоставляет способ отображения вашего канала Twitter на вашей странице. Я хорошо знаю, что он уже существует 20 раз. Это академическое упражнение. :)Ошибка импорта внешней библиотеки в библиотеку тегов шаблонов Django

Структура каталогов довольно проста:

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 работе отлично. Я также считаю, что у меня есть теги шаблонов, правильно названные и зарегистрированные.

Как вы можете видеть, я использую отличный Universal Feed Parser. Моя проблема заключается не в самом UFP, а в невозможности вызывать UFP при импорте библиотеки тегов шаблонов. Когда я {% load twitterfeed %} в base.py, я получаю следующее сообщение об ошибке:

'twitterfeed' is not a valid tag library: Could not load template library from django.templatetags.twitterfeed, No module named feedparser

импортировать feedparser с помощью следующего оператора:

import re, datetime, time, myapp.feedparser 

Лучшее, что я могу сказать, это сообщение об ошибке немного обманчива. Я думаю, что при загрузке библиотеки шаблонов происходит импорт ImportError, и это интерпретация Django.

Можно ли каким-либо образом импортировать файл feedparser.py в свое многоразовое приложение, не требуя от пользователей приложения размещать feedparser где-нибудь в PythonPath?

Спасибо!

ответ

2

Это выглядит как одна из тех раздражающих проблем относительного пути - решена в Python 2.6 и выше (где вы можете импортировать файл ..feedparser и т. Д.), Но часто немного сложнее в старых версиях. Один дешевый и жизнерадостный способ исправить это может быть просто для перемещения feedparser.py в ваш каталог templatetags, в качестве брата для twitterfeed.py

5

Я решаю эту проблему (библиотеки доставки, которые зависят от моего общего проекта) следующим образом. Во-первых, я создаю каталог «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.

+0

Спасибо Simon! Итак ... можно с уверенностью сказать, что это невозможно сделать таким образом, чтобы поддерживать мобильность приложений? – 2009-07-26 17:55:03

+0

Я бы не сказал, что ... вы можете определенно включать зависимости в приложении (а не в каталог ext /), но это может быть немного более странно, как вы обнаружили из своего вопроса. Я ленив, поэтому я обычно использую метод ext /, потому что знаю, что он работает. –

+0

Включение приложений прямо в приложение вызывает тонкие ошибки: как каталог приложения, так и его родительский элемент находятся в пути, поэтому его можно импортировать дважды, как «mypackage.app», так и «app». Безопаснее вставлять его в подкаталог на пути, поэтому для него есть только одно возможное имя («приложение»). –