ビューの検証デコレータ

デコレータについて話します



私たちはそれぞれ、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)を受け取る基本関数です。



ここで、許可されたユーザーを個人アカウントにスローする機能を作成するために(登録から想定)、次の手順を実行する必要があります。

  1. is_anonymous検証関数を作成します
  2. オフィスに投げられる関数を作成する(office_redirect)
  3. 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でデコレータを使用できます

この記事はそれほど複雑ではありませんが、初心者にとっては興味深いものになることを願っています。

誰もが素晴らしいジャンゴフレームワークの学習/使用/開発を楽しんでいます。




All Articles