デコレータについて話します
私たちはそれぞれ、login_requiredデコレータを複数回使用しており、同様のデコレータを作成した可能性が高いです(バスケットが空かどうかを確認するために言ってみましょう)。 このデコレータの機能を見てみましょう。
全体を見ると、次のように想像できます。
到着したリクエストをチェックし、結果に応じて、ビューまたは別の関数を提供するデコレータ-デコレータと呼びます。
スキームは同じなので、デコレータの「空白」を書くことができます。
def check_decorator(view=None, condition_func = lambda request, *args, **kwargs: True, false_func = lambda request, *args, **kwargs: HttpResponse()): ''' Checks by :function:condition_func, if true go to :function: view, else go to :function:false_func :param condition_func: Should return Boolean value :type condition_func: function :param false_func: Should return object of :class:`http.HttpResponse' :return: :class:`http.HttpResponse` ''' def decorator(view): @wraps(view) def wrapper(request, *args, **kwargs): if not condition_func(request, *args, **kwargs): return false_func(request, *args, **kwargs) return view(request, *args, **kwargs) return wrapper return decorator(view) if view else decorator
check_decoratorは、ビュー、条件関数(condition_func)、および条件が負を返す場合に使用される関数(false_func)を受け取る基本関数です。
ここで、許可されたユーザーを個人アカウントにスローする機能を作成するために(登録から想定)、次の手順を実行する必要があります。
- is_anonymous検証関数を作成します
- オフィスに投げられる関数を作成する(office_redirect)
- functools.partialと関数(is_anonymous、office_redirect)を使用して、デコレーターを作成します
from functools import partial is_anonymous = lambda request, *args, **kwargs: request.user.is_anonymous() office_redirect = lambda request, *args, **kwargs: redirect('office') # office - view urls should_be_anonymous = partial(check_decorator, condition_func=is_anonymous, false_func=office_redirect)
別の条件関数、または条件が満たされていないときに呼び出される関数(false_func)を書くのは難しいことではないと思います。
しかし、redirect_urlなしではどうでしょう
私たちの多くは、redirect_urlを指定することでユーザーの転送先を指定できることに慣れています。
@login_required(redirect_url=reverse_lazy('my_view_name')) def some_view(request, *args, **kwargs): pass
この場合、関数false_funcは常にリダイレクトを生成するため、URLを生成する場所を指定する必要があります。
「ワーク」に基づいてこの関数を作成しましょう。
def redirect_decorator(view=None, redirect_url=None, **kwargs): ''' Uses :function:`check_decorator` with false_func that returns :param:`redirect_url` ''' assert not redirect_url is None, "Redirect_url should be set" if 'false_handle_func' in kwargs: del kwargs['false_func'] redirect_func = lambda request, *args, **kwargs: redirect(redirect_url) return check_decorator(view=view, false_func=redirect_func, **kwargs)
redirect_decorator関数で、redirect_urlが渡されたかどうか、そして渡されたかどうかを確認します
false_func-削除します。 次に、check_decorator関数の値を返します。
should_be_anonymous関数を次のように書き換えることができます。
should_be_anonymous = partial(redirect_decorator, condition_func=is_anonymous)
そして、私たちが慣れ親しんだ形で使用します:
@should_be_anonymous(redirect_url=reverse_lazy('office')) def some_view(request, *args, **kwargs): pass
メッセージを送る
Djangoには、ユーザーにメッセージを送信できる素晴らしいdjango.messagesメッセージメカニズムがあります。
仕組みを見てみましょう。
ビューに書き込みます:
from django.contrib import messages def view(request, *args, **kwargs): ... messages.info("Hello World!") # p ...
テンプレートに表示します:
{% if messages %} <ul> {% for message in messages %} <li>{{ message }}</li> {% endfor %} </ul> {% endif %}
このメカニズムを使用すると、ユーザーがページにアクセスできなかった理由をユーザーに通知できます。
メッセージをリダイレクトして送信する関数を作成しましょう:
def redirect_message_decorator(view=None, message=None, redirect_url=None, **kwargs): ''' Uses :function: c`check_decorator` with false_func thar returns :param:`redirect_url` ''' assert not redirect_url is None, "Redirect_url should be set" assert not message is None, "Message should be set" if 'false_func' in kwargs: del kwargs['false_func'] def redirect_func(request, *args, **kwargs): messages.info(request, message) return redirect(redirect_url) return check_decorator(view=view, false_func=redirect_func, **kwargs)
メッセージを含むshould_be_anonymous関数は次のようになります。
should_be_anonymous = partial(redirect_message_decorator, condition_func=is_anonymous)
そして、このデコレーターの使用:
@should_be_anonymous(message=u' ', redirect_url=reverse_lazy('office')) def some_view(request, *args, **kwargs): pass
おわりに
このスニペットを使用して、 CBVでデコレータを使用できます。
この記事はそれほど複雑ではありませんが、初心者にとっては興味深いものになることを願っています。
誰もが素晴らしいジャンゴフレームワークの学習/使用/開発を楽しんでいます。