urls.py
ファイルでファイルを同時に編集しています。 これは
URL
とビューがまったく異なるという事実によるものであり、モジュール性を高めるためにそれらを分離しておく方が良いことを理解していますが、小さなプロジェクトの場合はビューとその設定を1か所で編集できると非常に便利です。
ここでは、もちろん、デコレーターに結び付けられたこのようなソリューションを提案します。
それでは、最終的に何を得たいのでしょうか? 新しいビューを描く必要があるとしましょう。
with_url
デコレータをこの関数に追加したいと思います。
@with_url(r'^my/cool/url/')
def my_cool_view(request):
...
彼はすべてを自分で縛りましたが、
urls.py
手を登る必要はありません
urls.py
この目的のために、パッケージの小さな
easyurls
モジュールが機能します。それを
djangoutils
と呼びましょう:
urlpatterns = []
def with_url(url, context={}):
def decorator(fun):
global urlpatterns
urlpatterns.append((url, fun, context))
return fun
return decorator
def load_patterns(module_name):
from django.conf.urls.defaults import patterns
__import__(module_name)
return patterns(module_name, *urlpatterns)
彼は何をしていますか?
with_url
デコレータは、
with_url
グローバル変数のビューに
URL
バインディングを追加し
URL
。 そして、
load_patterns
関数は、すべてのデコレータが機能するようにビューモジュールをインポートするだけで、その後、塗りつぶされた
urlpatterns
返します。
次のように使用されます。
urls.py
に書き込みます
from djangoutils.easyurls import load_patterns
urlpatterns = load_patterns('app.views') + patterns(...)
app.views
は、アプリケーションのビューモジュールです。 このファイルはもう見ていません。
app.views
モジュール
app.views
、デコレーターをインポートします。
from djangoutils.easyurls import with_url
そして今、新しいビューは次のように書くことができます:
#
@with_url(r'^json/list/items/')
@json_http
@in_list
def json_list_items(request, list):
...
# :-)
@with_url(r'^$')
@with_url(r'^start/', {'is_root': False})
def start(request, is_root=True):
...
余談:一般的に、私は積極的にデコレータを使用して、同じタイプのコードの記述を容易にします。 たとえば、ここで
json_http
デコレータは関数の結果をJSON文字列に変換し、応答にスローします。
すぐにわかる提案されたソリューションの欠点は、URLで1つの
load_patterns
のみを使用していることです。
urlpatterns
を
easyurls
からviewsモジュールに転送することで解決できます。 追加の利点は
load_patterns
を使用する必要があり、標準の
include
十分なので、これを行うのは難しくないと思います。 欠点として、各ビューモジュールで
urlpatterns = []
を記述する必要があります。この方法で作成します。 Pythonが1つのモジュールから別のモジュールのグローバル変数を作成し、それが既に存在するかどうかを確認できる場合は必要ありません。
ちなみに、これは自転車ではありませんか?
この場所を読んだ人に感謝します:-)