0

Django プロジェクト用の小さなアプリケーションを作成しています。アイデアは、ある種のウィジェットを作成することです。これは、包含タグを介してテンプレートに追加できる小さなビュー機能で、いくつかの脇情報 (ブログ レコード、クイック リンク リスト、メニューなど) を表示します。templatetagこの目的のために、デフォルトの登録メカニズムに似たものを作成したいと考えています。通常、次のコンポーネントが必要です。

  • これらのビュー関数を登録するためのカスタム デコレータ
  • 起動時にすべてのインストール済みアプリ (現在は「widgets.py」) で特定のモジュールを検索する関数 (おそらく settings.py から呼び出される)

私が今までに書いたものは次のようになります。

# -*- coding: utf-8 -*-


REGISTERED_WIDGETS = []

class Library(object):
    """
    Utility class for registering defined widgets
    """
    def widget(self, view=None, name=None, form_class=None):
        if name is None:
            name = view.__name__
        def decorator(view):
            print 'registering', view
            REGISTERED_WIDGETS.append((view, name, form_class))
            def wrapper(request, *args, **kwargs):
                return view(request, *args, **kwargs)
            return wrapper
        if view is not None:
            return decorator(view)
        else:
            return decorator

def search_widgets():
    """
    Search for 'widgets.py' modules inside installed applications and import them,
    hence initializing its registration
    """
    from django.conf import settings

    for app in settings.INSTALLED_APPS:
        try:
            module = __import__(app + '.widgets')
            print module
        except ImportError:
            pass
        else:
            print 'Imported widgets from ', app

if __name__ == '__main__':
    search_widgets()
    print REGISTERED_WIDGETS

それをテストするために、アプリケーションの 1 つ内の widgets.py にこのスタブ ウィジェットを追加しました。

# -*- coding: utf-8 -*-

from experiments.widgets.base import Library

register = Library()

@register.widget(name='dummy')
def dummy_widget(request):
    pass

このモジュールを実行すると、見つかったウィジェットで満たされた REGISTERED_WIDGETS 変数が表示されるはずですが、空です。実際には、次の出力が表示されます。

>>> %run widgets/base.py
<module 'django' from '/usr/lib/python2.7/dist-packages/django/__init__.pyc'>
Imported widgets from  django.contrib.admin
registering <function dummy_widget at 0x364f320>
<module 'experiments' from '/home/east825/Development/pycharm-experiments/experiments/../experiments/__init__.pyc'>
Imported widgets from  experiments.layout
[]

Python 共有グローバル変数の動作について、非常に重要なことを忘れていたようです。何かアドバイスはありますか?

4

1 に答える 1

1

モジュール base.py が 2 回インポートされる可能性はありますか?

base.py の先頭に「print 'base.py executable'」などの印刷を追加します。

編集:またはさらに良いことに、ID(REGISTERED_WIDGETS)を印刷します

于 2012-06-06T20:37:37.997 に答える