Djangoテンプレートタグライブラリ内の外部ライブラリのインポートエラー
-
19-09-2019 - |
質問
そこで、ページに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ファイルの開始に行ます。