Djangoテンプレートタグライブラリ内の外部ライブラリのインポートエラー

StackOverflow https://stackoverflow.com/questions/1185084

質問

そこで、ページにTwitterフィードを表示する方法を提供するDjango再利用可能なアプリを作成しようとしています。すでに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シェルを実行するとき、twitterfeed.pyで定義されている機能は完全に機能します。また、テンプレートタグが適切に指定され、登録されていると信じています。

ご覧のとおり、私は優れたものを使用しています ユニバーサルフィードパーサー. 。私の問題はUFP自体ではなく、テンプレートタグライブラリのインポート中にUFPが呼び出されないことです。私 {% load twitterfeed %} base.pyで、次のエラーが発生します。

「TwitterFeed」は有効なタグライブラリではありません:django.templateTags.twitterfeedからテンプレートライブラリをロードできませんでした。

次のステートメントを使用してフィードパージャーをインポートします。

import re, datetime, time, myapp.feedparser

私が言うことができる最善のことは、このエラーメッセージは少しだまされています。テンプレートライブラリがロードされたときにインポーターリアが進行していると思います。これはDjangoの解釈です。

アプリのユーザーがPythonPathのどこかにFeedParserを配置することを要求することなく、再利用可能なアプリ内でFeedParser.pyをインポートできる方法はありますか?

ありがとう!

役に立ちましたか?

解決

これは、Python 2.6以降で解決された迷惑な相対パスの問題の1つのように見えます(Import ..FeedParserなどを実行できる)が、古いバージョンでは少し注意が必要です。これを修正するための安価で陽気な方法の1つは、TwitterFeed.pyの兄弟として、FeedParser.pyをTemplateTagsディレクトリに移動するだけです。

他のヒント

次の方法で、この種の問題(プロジェクト全体の依存関係である図書館を配送)を解決します。まず、プロジェクトのルートに「ext」ディレクトリを作成します(あなたの場合は myproject/ext)。次に、その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

virtualenvsのようなものをいじりたくない場合、これは本当にうまくいくと思います。プロジェクトを展開するときは、パスも正しいことを確認する必要があります - 私は通常、同じものを追加してこれを解決します sys.path.insert mod_wsgi app.wsgiファイルの開始に行ます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top