在Django模板标记库中导入外部库时出错

3 python django feedparser templatetags

所以我正在尝试编写一个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
Run Code Online (Sandbox Code Playgroud)

运行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
Run Code Online (Sandbox Code Playgroud)

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

有没有什么办法可以在我的可重用应用程序中导入feedparser.py,而无需让应用程序的用户在其PythonPath中的某处放置feedparser?

谢谢!

Sim*_*son 5

我通过以下方式解决了这种问题(运送库是我整个项目的依赖项).首先,我在项目的根目录中创建一个"ext"目录(在您的情况下myproject/ext).然后我将feedparser之类的依赖项放在ext目录中 - myproject/ext/feedparser

最后,我将manage.py脚本更改为在sys.path前面插入ext /目录.这意味着双方./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
Run Code Online (Sandbox Code Playgroud)

我发现如果你不想搞乱像virtualenvs这样的东西,这个效果真的很好.在部署项目时,你必须确保路径也是正确的 - 我通常通过在sys.path.insertmod_wsgi app.wsgi文件的开头添加相同的行来解决这个问题.