はじめに
Django の学習は実際には非常に簡単で、ほとんど努力せずに始めることができることは誰もが知っています。 URL の構成、それを処理する関数への割り当て、応答の返しについては、理解するのが難しいことはほとんどありません。
書けば書くほど、徐々にいくつかの問題に気づきます。たとえば、あるビューは比較的複雑で、他の多くの関数を呼び出します。これらの関数をカプセル化したい場合はどうすればよいでしょうか?もちろん、コメント #------view------ を使用して関数を分離することもできます。この方法は単に自分自身を欺いているだけであり、カプセル化されていません。
Python はオブジェクト指向プログラミング言語です。開発に関数のみを使用すると、オブジェクト指向の多くの利点 (継承、カプセル化、ポリモーフィズム) が失われます。そこで、Django は後に Class-Based-View を追加しました。これにより、クラスを使用して View を作成できるようになります。この利点は主に次の 2 つです:
コードの再利用性が向上し、Mixin (多重継承) などのオブジェクト指向技術を使用できるようになります
さまざまな HTTP メソッドを処理するためにさまざまな関数を使用できるようになりますコードの可読性を向上させるために if 判定を多用する代わりに
クラスベースのビューを使用してください
GET メソッドを処理するビューを作成したい場合、関数を使用して作成すると次のようになります。
from django.http import HttpResponse def my_view(request): if request.method == 'GET': # <view logic> return HttpResponse('result')
クラスベースビューで書くとこんな感じになります。
from django.http import HttpResponse from django.views import View class MyView(View): def get(self, request): # <view logic> return HttpResponse('result')
Django の URL は、クラスではなく呼び出し可能な関数にリクエストを割り当てます。この問題に対処するために、クラスベースのビューは as_view()
静态方法(也就是类方法),调用这个方法,会创建一个类的实例,然后通过实例调用dispatch()
方法,dispatch()
方法会根据request的method的不同调用相应的方法来处理request(如get()
, post()
などを提供します)。この時点では、これらのメソッドは関数ベースのビューとほぼ同じで、リクエストを受信して応答を返す必要があります。メソッドが定義されていない場合、HttpResponseNotAllowed 例外がスローされます。
URL に次のように記述します:
# urls.py from django.conf.urls import url from myapp.views import MyView urlpatterns = [ url(r'^about/$', MyView.as_view()), ]
クラスの属性は 2 つの方法で設定できます。最初の方法は一般的な Python メソッドであり、サブクラスによってオーバーライドできます。
from django.http import HttpResponse from django.views import View class GreetingView(View): greeting = "Good Day" def get(self, request): return HttpResponse(self.greeting) # You can override that in a subclass class MorningGreetingView(GreetingView): greeting = "Morning to ya"
2 番目の方法では、URL でクラスの属性を指定することもできます:
URL でクラスの属性を設定します Python
urlpatterns = [ url(r'^about/$', GreetingView.as_view(greeting="G'day")), ]
Mixin を使用します
私 Django のクラスベースビュー (以下、CBV) を理解するには、まず Django が CBV を導入した目的を理解する必要があると感じています。 Django 1.3 より前のジェネリック ビューは、関数ベースのビューである function-based-view (fbv) を使用する、いわゆるユニバーサル ビューでした。 fbv は cbv よりも Python 的であると考える人もいますが、そうではありません。 Python の重要な機能の 1 つはオブジェクト指向です。また、cbv は Python のオブジェクト指向の性質をよりよく反映できます。 cbv はクラスを通じて view メソッドを実装します。関数と比較して、クラスはポリモーフィズムの特異性をより有効に活用できるため、プロジェクト内のより一般的な関数をマクロ レベルから抽象化することが容易になります。ポリモーフィズムについてはあまり説明がありませんので、興味のある方はご自身でググってみてください。つまり、一つの物が複数の形(特徴)を持っていると理解できます。 cbv の実装原理は、django のソースコードを見るとよくわかりますが、一般的には、この cbv に URL がルーティングされた後、cbv 内のdispatch メソッドを通じて get リクエストが cbv.get に振り分けられます。メソッドを処理し、post リクエストは cbv .post メソッドの処理に分散されます。他のメソッドも同様です。ポリモーフィズムの使い方mixin の概念は cbv で導入されています。 Mixin は、作成されたいくつかの基本クラスにすぎず、さまざまな Mixin と組み合わせて、最終的に必要なクラスになります。
つまり、cbv を理解するための基礎は Mixin を理解することです。 Django ではコードを再利用するために Mixin が使用されます。View クラスは複数の Mixin を継承できますが、継承できるのは 1 つの View (View のサブクラスを含む) だけです。View を一番右に、複数の Mixin を左側に記述することをお勧めします。 Mixin も比較的複雑なテクノロジーですので、この記事では詳しく説明しません。Mixin については今後記事を書きます。
デコレーターを使用する
CBV では、method_decorator を使用してメソッドを装飾できます。
from django.contrib.auth.decorators import login_required from django.utils.decorators import method_decorator from django.views.generic import TemplateView class ProtectedView(TemplateView): template_name = 'secret.html' @method_decorator(login_required) def dispatch(self, *args, **kwargs): return super(ProtectedView, self).dispatch(*args, **kwargs)
をクラスに記述してメソッド名で渡すこともできます。
@method_decorator(login_required, name='dispatch') class ProtectedView(TemplateView): template_name = 'secret.html'
メソッドを修飾するデコレータが複数ある場合、それらをリストとして記述することができます。たとえば、次の 2 つの書き方は同等です。
decorators = [never_cache, login_required] @method_decorator(decorators, name='dispatch') class ProtectedView(TemplateView): template_name = 'secret.html' @method_decorator(never_cache, name='dispatch') @method_decorator(login_required, name='dispatch') class ProtectedView(TemplateView): template_name = 'secret.html'
Django のクラスベースビューの学習ノートに関連するその他の記事については、PHP 中国語 Web サイトに注目してください。