UPD Lyrical余談:当初、デコレータの仕事に対する曲がった理解のために、私は多くのナンセンスを書きました。 現在、決定ははるかに正確で直接的です。 さらに、私はそれを明確に説明することさえできます。それについて私はコメンテーターにとても感謝しています。
まず、 デコレータの作業に慣れることをお勧めします(非常に慎重に!)。
私が抱えていた問題は、文字通り次のとおりでした:
Djangoには、ユーザープロファイルにいくつかの変数があるかどうかを確認する前に、ある種の関数があります。
具体的な解決策は次のとおりです。
def check_nickname(funct): def wrapper(request, *args, **kwargs): if request.user.profile.nickname: return funct(request, *args, **kwargs) else: from django.shortcuts import render_to_response from django.template import RequestContext return render_to_response('need_profile.html', RequestContext(request)) return wrapper
check_nickname
関数は、
Django
形式の関数のデコレーターです。これについては、特定のタイプの
request
パラメーターが渡されることが確認されています。 装飾された関数は、装飾された関数の代わりに返される
wrapper
渡されます。
デコレータの原理:
@f1 def func(x): pass # : def func(x): pass func = f1(func)
つまり 実際、元の関数の代わりに、
wrapper
関数は
check_nickname
デコレータによって返されます。 また、ビューの元の機能を目的としたすべてのパラメーター
wrapper
受け取る
wrapper
あり、次のアクションのロジックは既にそれらに基づいています。
明確にしてくれたDeepwalkerに再び感謝します。