所以我正在尝试编写一个Django可重用的应用程序,它提供了一种在页面上显示Twitter提要的方法。我知道它已经存在了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 shell时,twitterfeed.py中定义的函数运行良好。我也相信我有正确命名和注册的模板标签。
正如您所看到的,我使用了优秀的Universal Feed Parser。我的问题不在UFP本身,而是UFP在导入模板标签库时无法调用。当我在base.py中{% load twitterfeed %}
时,出现以下错误:
'twitterfeed'不是有效标签 library:无法加载模板 图书馆来自 django.templatetags.twitterfeed,不 名为feedparser的模块
我使用以下语句导入feedparser:
import re, datetime, time, myapp.feedparser
我能说的最好,这个错误信息有点欺骗。我认为加载模板库时会发生ImportError,这是Django对它的解释。
有什么方法可以在我的可重用应用程序中导入feedparser.py,而无需让应用程序的用户在其PythonPath中的某处放置feedparser?
谢谢!
答案 0 :(得分: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这样的东西,我发现这个效果非常好。在部署项目时,你必须确保路径也是正确的 - 我通常通过在mod_wsgi app.wsgi文件的开头添加相同的sys.path.insert
行来解决这个问题。
答案 1 :(得分:2)
这看起来像是恼人的相对路径问题之一 - 在Python 2.6及更高版本中解决(你可以在其中导入..feedparser等)但在旧版本上经常有点棘手。解决这个问题的一种便宜而愉快的方法就是将feedparser.py移动到你的templatetags目录中,作为twitterfeed.py的兄弟姐妹