表示するURLを自動的にリンクする

私は最近Djangoに夢中になり、このフレームワークが本当に好きです。 ただし、厄介な詳細があります。 これは、新しいビューを作成するときに、ビューと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つのモジュールから別のモジュールのグローバル変数を作成し、それが既に存在するかどうかを確認できる場合は必要ありません。



ちなみに、これは自転車ではありませんか?



この場所を読んだ人に感謝します:-)



All Articles