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