【问题标题】:Error importing external library within Django template tag library在 Django 模板标签库中导入外部库时出错
【发布时间】:2009-07-26 17:36:06
【问题描述】:

所以我正在尝试编写一个 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' 不是有效标签 库:无法加载模板 图书馆从 django.templatetags.twitterfeed,没有 名为 feedparser 的模块

我使用以下语句导入 feedparser:

import re, datetime, time, myapp.feedparser

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

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

谢谢!

【问题讨论】:

    标签: python django feedparser templatetags


    【解决方案1】:

    我通过以下方式解决了此类问题(运送作为我整个项目的依赖项的库)。首先,我在项目的根目录中创建了一个“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 行来解决这个问题。

    【讨论】:

    • 谢谢西蒙!所以...可以肯定地说,以保持应用可移植性的方式来完成是不可能的?
    • 我不会这么说...您绝对可以在应用程序中包含依赖项(而不是 ext/ 目录),但正如您从您的问题。我很懒,所以我倾向于只使用 ext/ 方法,因为我知道它有效。
    • 将应用程序直接包含在应用程序中会导致细微的错误:应用程序目录及其父级都在路径中,因此可以将其导入两次,分别为“mypackage.app”和“app”。将其粘贴在路径中的子目录中更安全,因此它只有一个可能的名称(“app”)。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-22
      • 2020-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多