3

そこで、ページに 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 で定義された関数が完全に機能します。また、テンプレート タグに適切な名前を付けて登録していると思います。

ご覧のとおり、優れたUniversal Feed Parserを使用しています。私の問題は UFP 自体にあるのではなく、テンプレート タグ ライブラリのインポート中に UFP を呼び出せないことにあります。base.py{% load twitterfeed %}に入ると、次のエラーが発生します。

'twitterfeed' は有効なタグ ライブラリではありません: django.templatetags.twitterfeed からテンプレート ライブラリを読み込めませんでした。feedparser という名前のモジュールはありません

次のステートメントを使用して feedparser をインポートします。

import re, datetime, time, myapp.feedparser

私が知る限り、このエラー メッセージは少し欺瞞的です。テンプレート ライブラリが読み込まれると ImportError が発生すると思いますが、これは Django の解釈です。

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

ありがとう!

4

2 に答える 2

5

この種の問題 (プロジェクト全体の依存関係であるライブラリを配布すること) を次の方法で解決します。まず、プロジェクトのルートに「ext」ディレクトリを作成します (この場合は になりますmyproject/ext)。次に、feedparser などの依存関係をその ext ディレクトリに配置します。myproject/ext/feedparser

最後に、sys.path の先頭に ext/ ディレクトリを挿入するように manage.py スクリプトを変更します。これは両方./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

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

于 2009-07-26T17:52:37.140 に答える
2

これは厄介な相対パスの問題の 1 つのように見えます - Python 2.6 以降 (ここでは import ..feedparser などを実行できます) で解決されますが、古いバージョンではしばしば少し注意が必要です。これを修正する安くて楽しい方法の 1 つは、feedparser.py を twitterfeed.py の兄弟として templatetags ディレクトリに移動することです。

于 2009-07-26T19:24:37.187 に答える