python-django projelerde ( class-based views nedir? kullanımı nasıldır?)

Function-based generic views kullanımından Class-based generic views kullanımına geçiş süreci:


Başlangıçta, views(görünüm) geliştirilirken  ortak deyimler ve kalıpların kullanıldığı fark edildi.  Yaygın kullanılan görünümleri(views)  daha kolay geliştirmek için ilk olarak Function-based generic views tabanlı views(görünümler) geliştirildi. 
Daha sonra Function-based generic views kullanımı, basit durumları iyi bir şekilde ele alsalar da, bunları bazı yapılandırma seçeneklerinin ötesine genişletmenin veya özelleştirmenin bir yolu olmadığı ve gerçek uygulamaların geliştirilmesinde kullanışlı olmadıklarını fark edildi. 

Kısaca Function-based generic views geliştiricilere kısıtlı imkan tanıdığı fark edildi. Bu kısıtlı durumu ortadan kaldırmak için Function-based generic views tabanlı views yerine 
Gerçek bir uygulama yaparken daha esnek daha kolay düzenlenebilir Class-based views lar geliştirildi.

Function-based generic views eksikliğini gidermek için Class-based generic views lar daha kolay etkili esnek çözümler sunmakta. Ancak Class-based generic views ile class-based' in  aynı anlama gelmediğini de bilmelisiniz.

Django'nun sınıf tabanlı genel görünümler(Class-based generic views) oluşturmak için kullandığı temel sınıfların ve karışımların araç takımı, maksimum esneklik için oluşturulmuştur ve bu nedenle, en basit kullanımda ilgilenmeniz olası olmayan varsayılan yöntem uygulamaları ve öznitelikleri kolayca kullanmanızı sağlar. Örneğin sizi sınırlayan sınıf temelli(class-based) nitelik olan form_class için get_form metodu kullanır ama bunun  yerine Class-based generic views ile   get_form_class metodu doğrudan kullanılabilir.

özetle;
Django geliştiricileri(team) sınıf tabanlı generic görünümlerin (class-based generic views), kalıtım (inheritance) ve karışım (mix-ins) sayesinde daha fonksiyonel ve daha az kod(dry-dont repeat yourself) satırı yazarak daha kolay görünümler geliştirmeye olanak tanıdığını farkettiler. 


class-based views Kullanımını inceleyelim:



Sınıf tabanlı görünüm (a class-based view) temelde, tek bir görünüm fonksiyonu(işlevi) için koşullu dallanan kod yerine,  farklı HTTP istek metodlarına farklı sınıf örnek metodlarıyla yanıt vermenize olanak tanır.
Django takımı(team) sınıf tabanlı generic görünümlerin (class-based generic views), kalıtım (inheritance) ve karışım (mix-ins) sayesinde daha fonksiyonel ve daha az kod(dry-dont repeat yourself) satırı yazarak daha kolay görünümler geliştirmeye olanak tanıdığını farkettiler.  

Şimdi function temelli generic view yazımı ile class-base view temelli kullanımını inceleyelim. 


a. Function-based views kullanımı:
1.from django.http import HttpResponse
2.def my_view(request):
3.   if request.method == 'GET':
4.       # <view logic> 
5.    return HttpResponse('result')


b. Class-based views kullanımı:
1.from django.http import HttpResponse
2.from django.views import View
3.class MyView(View):
4.   def get(self, request):
5.        # <view logic>
6.        return HttpResponse('result')


Yukarıdaki iki farklı koddan(a.fonksiyon temelli views-b. sınıf temelli views) sonuçlar çıkarmaya çalışalım:
1. Her ikisinde de def komutu kullanılmış yani fonksiyon tanımlanmış.
(class içinde tanımlanan fonksiyon artık method(yöntem) adını alır.) 
2. class(sınıf) temelli kod' a class komutu ile başlanmış. fonksiyon temelli kod' a ise direk def komutu ile başlanmış.
3. Class-based views oluştururken .View isimli class tan kalıtım alınmış.( kodda 3. satırdan anlarız) 
Bu ne demek daha önce django geliştiricileri tarafından tanımlanmış elimizde hazır bir Views adında bir class var. Görünümlerimizi artık biz bu View class sayesinde daha az kod yazarak kullanacağız. 
Eğer görünümümüzü fonksiyon temelli kullanmak isteseydik bir sürü if yapısı kullanmak zorunda kalabilirdik. 


4. Django'nun URL çözümleyicisi yukarıdaki her iki kodda isteği(request) ve ilişkili argümanları, bir çağırılabilir bir fonksiyonla göndermeyi bekler. Sınıf temelli views kullanımında bu işi as_view isimli class ta bulunan metod(aslında yine bir fonksiyon ama class içinde) bunu yapabilir. 

Özetle as_view class' ının içinde çağırılabilir fonksiyon(aslında metod demek daha doğru) bulunur. Aşağıda as_view( ) class ı n kullanım örneğini görüyorsunuz. 

#urls.py
1.from django.urls import path
2.from myapp.views import MyView

3.urlpatterns = [
4.    path('about/', MyView.as_view()),
5. ]

5. Her iki kod yazımında HttpResponse kullanılmış. Ama artık gerçek uygulama yazmaya başladığınızda  class-based view kullanırken HttpResponse la birlikte httpshortcuts veya TemplateResponse nesnelerini de kullanabileceksiniz.



Sınıfın alt sınıfında nitelik ve metodları geçersiz kılma (overriding attributes and methods in the subclass)

Parent(ana class) class ın nitelik veya metodunu geçersiz kılmayı bir örnekle görelim. Bunun için iki yöntem vardır.


Önce classımızı( yani parent class) yazalım:

from django.http import HttpResponse
from django.views import View

class GreetingView(View):
    greeting = "Good Day"

    def get(self, request):
        return HttpResponse(self.greeting)
Burada parent classımız GreetingView ismini aldı. Şimdi ovreride( geçersiz kılma) işini yapalım.

1. yol : 

class MorningGreetingView(GreetingView):
    greeting = "Morning to ya"

2. yol için kodumuz, bunun nereye yazıldığı önemli. ( urlConf dosyası içinde as_view() kullanarak yapıldığını görüyoruz.)

urlpatterns = [
    path('about/', GreetingView.as_view(greeting="G'day")),
]




















HATIRLATICI NOT:
Yukarıdaki iki örneğin arasındaki farkı anlamak için class(sınıf) function(fonksiyon) ve method(yöntem-metod) kavramlarını iyi bilmek gerekir. 
Kısaca açıklamaya çalışalım. Bu üç tanımı ancak birbiri ile ilişkilendirerek açıklayabiliriz. 

Class(sınıf) : İçerisinde methods(yöntem-metod) ve variables(değişkenler) barındıran kod topluluğudur diyebiliriz. Ayrıca bu kod topluluğu bir kez oluşturulduktan tekrar tekrar kullanabiliriz. 
Function(fonksiyon): Bir işi bir görevi yerine getirmek için yazılmış kod parçalarıdır. python dilinde def komutu fonksiyon tanımlamak için kullanılır.
Şimdi sınıf (class) ve Function(fonksiyon)  kavramlarını verdikten sonra fonksiyon ve method(yöntem-metod) arasındaki farka bakalım. Aşağıda bir fonksiyon örneği verilmiş. 


def
carpma(x,y):
    return x*y

Örneğe göre çıkarımlar yapalım:
1. x,y ise bir değişken( variables)
2.  def komutu fonksiyon tanımlamada kullanılmış. Yukarıdaki bir fonksiyon(functions) örneğidir.
3. Yukarıdaki örnekte method (yöntem-metod) nerede? sorusu akla geliyor. İşte bu noktada sınıf(class) kavramı akla gelmeli. Eğer bu fonksiyon class(sınıfın) içinde tanımlanmış olsaydı bu örneğe fonksiyon değil  method(yöntem-metod) ismi verilecekti.

Aşağıdaki örnekte  geçen fonksiyon(function) artık method(yöntem-metod) olarak geçer. Çünkü class içinde kullanılan fonksiyon artık metod ismini alır.

class
BilisimOgretmen():
      ad = "çınar"
      soyad="akarsu"
    def EkrandaGoster(self):
        print(self.adi)
        print(self.soyad)


Yorum Gönder

0 Yorumlar