表示する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のみを使用していることです。 urlpatternseasyurlsからviewsモジュールに転送することで解決できます。 追加の利点はload_patternsを使用する必要があり、標準のinclude十分なので、これを行うのは難しくないと思います。 欠点として、各ビューモジュールでurlpatterns = []を記述する必要があります。この方法で作成します。 Pythonが1つのモジュールから別のモジュールのグローバル変数を作成し、それが既に存在するかどうかを確認できる場合は必要ありません。

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

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

Source: https://habr.com/ru/post/J24989/


All Articles