3

因此,我正在尝试编写一个 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。当我{% load twitterfeed %}在 base.py 中时,我收到以下错误:

'twitterfeed' 不是有效的标签库:无法从 django.templatetags.twitterfeed 加载模板库,没有名为 feedparser 的模块

我使用以下语句导入 feedparser:

import re, datetime, time, myapp.feedparser

我能说的最好的,这个错误信息有点欺骗性。我认为加载模板库时会发生 ImportError,这是 Django 对它的解释。

有什么方法可以在我的可重用应用程序中导入 feedparser.py,而无需应用程序的用户将 feedparser 放置在他们的 PythonPath 中的某个位置?

谢谢!

4

2 回答 2

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 文件的开头添加同一行来解决这个问题。

于 2009-07-26T17:52:37.140 回答
2

这看起来像是那些烦人的相对路径问题之一 - 在 Python 2.6 及更高版本中已解决(您可以在其中执行 import ..feedparser 等),但在旧版本上通常有点棘手。解决此问题的一种廉价而愉快的方法可能是将 feedparser.py 移动到您的 templatetags 目录中,作为 twitterfeed.py 的兄弟

于 2009-07-26T19:24:37.187 回答