Django'daki Model-View-Controller Desenine Giriş

Model-View-Controller (MVC) modeli, MVC ile harita oluşturmak için zaman testini gerçekleştiren bir mimari tasarımdır ve bu kavramları nasıl genişletebilirsiniz, uygulanabilir ve test edilebilir. Django, yüksek seviyeli Python web çerçevesi, kendi terminolojisini kullanır - modeller, Görüntüleme ve Şablonlar - temel prensipler MVC ile yakından uyumlu.Bu kavramları nasıl genişleteceğinizi anlamak için, bunun hakkında daha kolay ve doğrulanabilir hale getirebilirsiniz.

Bu makale, MVC desenlerini derinlikte araştırıyor, Django'nun her bileşeni nasıl uyguladığını ve kod tabanınızı temiz ve ölçeklenebilir tutmak için ek soyutlama katmanları nasıl uygulayabileceğinizi gösteriyor. İş mantığını organize etmek, etkili testleri yazmak ve Django'nun inşa edilmiş araçlarını endişelerin ayrılması için en iyi uygulamaları ele alacağız.

Django'da MVC Triad'ı istila et

MVC modeli, üç birbirine bağlı bileşene bir uygulama ayırır:

  • [FONT:0) Model[Dönetici:0)[Dönetici:0)[[Dönetici:0)
  • [FONT:0)View[DÜT:1) - Sunum mantığı ve kullanıcı arayüzünü ele alalım.
  • [FONT:0)Denetler[Döneticiler 1 ) - Model ve View arasındaki kullanıcı girişi ve koordinatları.

Django bu rolleri biraz yeniden yorumluyor. “Model” doğrudan MVC Modeline karşılık geliyor. Django'daki “View” bir kontrol olarak hareket ediyor - Modele meydan okuyor ve yanıt veriyor. “Template”, MVC View olarak hizmet ediyor, HTML (veya diğer çıktı formatları) istemci için.

Django'nun Model Katmanı

Django, veri modellerini Python sınıfları olarak tanımlamanıza olanak sağlayan güçlü bir Object-Relational Mapping (ORM) sistemi sunar ve veri haritalarını veritabanı masalarına döndürür ve örneklerin veritabanı işlemleri için yazılmasına izin verir.In using Django's model fields, you can define columns, relationship ( ⁇ Key, ManyTo ManyField, OneToOneToOneField), and constraints.The ORM abstracts away SQL, allows you to write Python code for database operations.

Modelleri temiz ve odaklanmış tutmak için, bu uygulamaları takip edin:

  • [FONT:0) Mümkün olduğunda iş mantığını tut.[Dönetici: 1) Modeller öncelikle veri yapısını ve ilişkileri tanımlamalı, karmaşık algoritmaları veya birden fazla varlık kapsayan geçerlilik kuralları tanımlamalıdır.
  • [FONT:0) Model yöneticileri ve sorgu setleri [Dönetici: 1) - Özel yöneticilere ortak sorgular. Bu, yalın görüşleri tutar ve yeniden teşvik eder.
  • [FONT:0]Leverage modeli basit işlemler için yöntemler) - Bir mülkün hesaplanması veya başka modellerle etkileşime girilmesi için ağır mantıktan kaçın.
  • [FONT:0) Hava değişiklikleri için göçler yaz[Dönetici: 1) Django'nun göç sistemi değişiklikleri izliyor ve çevreler boyunca güvenli dağıtım sağlar.

Django Görüntülemeleri kontrolörler olarak

Django görüşlerini kontrol edici rolü ele alır: HTTP isteği kabul ederler, gerekli işlemleri gerçekleştirirler (örneğin veritabanını modeller aracılığıyla sorgulayın), ve HTTP yanıtını döndürür. Django iki birincil görüş biçimini destekler: fonksiyon tabanlı görüş (FBVs) ve sınıf tabanlı görüşler (CBVs).

[FONT-based views[[[Dönetici:0]) Basit ve açık. Küçük, tek amaçlı uç noktaları için idealdir. Ancak, uygulamanız büyüdükçe, kendinizi tekrarlama kodu (örneğin, paginasyon, liste nesneleri veya form geçerliliği) bulabilirsiniz.

[FONT=0)Köpek tabanlı görüşler[[Dönetici:0)[[Döneticiler için inşa edilmiş genel davranışlar (ListView, DetayView, CreateView, vs.) Kodu yeniden yazılmamış ve mixinler aracılığıyla yeniden yapılandırmaya teşvik ederler. Örneğin, bir ListeView otomatik olarak paginasyon, sorguset filtreleme ve bağlam oluşturma.You can override methods likeFLT:2 Yeniden yazmaz.

Ne olursa olsun, ince görüş tutun. Push business logic into service modülleri, formlar veya faydalı fonksiyonlar.Bu test etmek ve çoğaltmayı azaltmak için daha kolay bir görünüm sağlar.

Şablonlar Olarak

Django'nun şablon motoru, statik işaretlerini dinamik bağlam değişkenleriyle birleştirerek HTML'yi oluşturur. Şablonlar sunum katmanını oluşturur (projeksiyonu) Klasik MVC'de "View" oluşturur. Django'nun şablon mirası sistemi, temel bir iskelet oluşturmanızı ve çocuk şablonlarında genişletmenizi sağlar, kırmızıdansiyon ve basitleştirme düzeni değişiklikleri azaltır.

şablonlar için en iyi uygulamalar şunları içerir:

  • [FONT:0) Mantık minimum - Şablonlar sadece sunum mantığı içermelidir ( listeler üzerinde durulmalıdır, koşullu elemanlar). Python seviyesindeki iş mantığından kaçının.
  • [FONT:0)Özel şablon etiketleri ve filtreler - Karmaşık formatlama veya yeniden kullanılabilir UI bileşenleri için, kendi etiketlerinizi veya filtrelerinizi şablonda yer alan mantık yerine oluşturun.
  • [FONT=0) Uygulama ile ilgili şablonlar[[Dönetici: 1 ) - Uygulamadan sonra (örneğin, [[Döneticiler) aşağıdaki notlar aşağıdaki gibidir.

Django Apps ile bir modüler Codebase oluşturmak

Django'daki modülerlik, uygulamalar kavramıyla başlar.Her Django projesi, farklı bir alan veya özellikten sorumlu, her bir e-ticaret sitesi, uygulama alanları için uygulama olabilir.)

Uygulamaları gerçekten modüler tutmak için:

  • [[Dönetici sınırları[[[Dönetici:0)[[[Dönetici: 1) Bir uygulama, diğer uygulamalara tek bir sorumluluk ve en az darbeye sahip olmalıdır. Django'nun sinyalleri veya özel ortaware'i sıkı ithalat olmadan iletişim kurmak için kullanın.
  • [[Dönetici uygulamalar[[Döneticiler)[Döneticiler) - Uygulamalarınızı tasarlayın ve diğer projelerde yeniden kullanılabilirler.Bu, zor kodlanmış ayarlardan veya projedeki kök URL'lere doğrudan referanslardan kaçınılması anlamına gelir.
  • [[DÜDÜ:0) Bağımlılığı ([DÜT:1) kullanın - Bir uygulama başka bir uygulamadan bir şeye ihtiyaç duyduğunda, bir parametre olarak geçer veya testlerde alay edilebilir bir servis katmanı kullanabilir.

İş Mantıkını Keşfedin: Servis Katmanı

Test edilebilirliği ve modülerliği geliştirmek için en etkili yollardan biri bir hizmet katmanı tanıtmaktır. Bir hizmet modülü Django-spic request/response işleminden ücretsiz olarak, bu ayrımı bir web sunucusu veya veritabanı (malzeme için gerekli olmayan) test etmenizi sağlar.

Örneğin, bir ödemeyi idare eden bir görüş içinde işleme mantığı yazmak yerine:

def process_payment(request):
 # ... fetch user, order
 # ... call Stripe API
 # ... update order status
 return redirect('success')

Stripe etkileşimi bir hizmete taşıyabilirsiniz:

# services/payment_service.py
class PaymentService:
 def process(self, user, order, payment_info):
 # Stripe API calls, business rules, etc.
 # Return result and possibly new order status
 pass

Sonra görüş sadece hizmeti çağırır ve yanıtları ele alır. Bu yaklaşım, dış API'leri ve veritabanı çağrılarını alay ederek ödeme mantığını test etmek için basit hale getirir.

Django'da Test edilebilir Kod

Test edilebilirliği, doğrudan temiz MVC ayrılıklarından yararlanır. bileşenler ayrıştırılırken, onları izolasyonda test edebilirsiniz. Django'nun yerleşik test çerçevesi ( Python'un 03: 16) modelleri, görüşleri, şablonlar ve formlar için testler oluşturmak için araçlar sağlar. ek olarak, üçüncü taraf kütüphaneler daha konciz ve güçlü fikstürler sunar.

Birim Testi Modelleme

Model testleri, veri yapınızın ve iş kurallarınızın doğru şekilde çalıştığını doğrulamalıdır.Süresel test yöntemlerinde örnek olarak model örnekleri kullanın. Örneğin, bir modelin [[Dönemli|tasarımsal yönetici yöntemi doğru döndürürse.

from django.test import TestCase
from .models import Product

class ProductModelTest(TestCase):
 def test_string_representation(self):
 product = Product(name='Test Product')
 self.assertEqual(str(product), product.name)

Daha karmaşık model mantığı için, dış bağımlılıkları e-posta gönderme veya üçüncü taraf API çağrıları gibi değiştirmek için [[ŞUygunT:15” kullanmayı düşünün.

Test Görüntüleme (Denetleyiciler)

Django'nun test müşterisi, HTTP isteklerini simüle etmenizi ve cevapları incelemenizi sağlar. Bu, kontrol etmek, doğrulama ve şablon oluşturmayı kontrol eden entegrasyon testleri için idealdir. Ancak, içinde mantık test etmek için, bu mantığın hizmet veya diğer modüllere ayırmalısınız.

Sınıf tabanlı görüşleri test ettiğinizde, doğrudan görüntü sınıfını (veya test müşterisini kullanabilir) ve bağlam verileri, durum kodları ve yönlendirmeleri üzerinde ileri sürebilirsiniz. Hem mutlu yolları hem de hata senaryolarını test edebilirsiniz (örneğin, izin, form doğrulama hataları).

Test Şablonları

Şablon mantığı, HTML'nin beklenen elementleri kontrol eden göz önünde bulunduran göz önünde bulundurularak en iyi testlerden biridir. karmaşık şablon etiketleri veya filtreler için, özel birim testleri yazın. Django'sDANFLT:16) ve [[ENFLT:17|prodüktörlükleri size bir şablon oluşturmanızı ve çıktınızı ileri sür.

from django.template import Template, Context
from django.test import TestCase

class CustomTagTest(TestCase):
 def test_uppercase_filter(self):
 t = Template('{% load my_filters %}{{ value|my_upper }}')
 c = Context({'value': 'hello'})
 self.assertEqual(t.render(c), 'HELLO')

Mocking ve Bağımlılık Enjeksiyonu

Hızlı, odaklanmış ünite testleri yazmak için, [[DörtÜDÜSÜSÜSÜSÜSÜSÜSÜSÜŞÜNÜSÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜ, Dış hizmetleri, veritabanı sorgularını veya hatta Django'nun ORM'sini test etmek için, bir e-posta gönderen bir hizmeti test ederken, gerçek e-postayı alay etmek için işlev.

Bağımlılık enjeksiyonu başka bir tekniktir: tüm bağımlılıkları (database seansları, dış API'ler, yapılandırma) açıkça fonksiyonlarınıza veya sınıf yapıcılara açıktır. Bu, gerçek uygulamaları alaylarla yerine getirmek kolaylaşır.

Temiz Django Kodbase için en iyi uygulamalar

Ana MVC haritalarının ötesinde, birkaç teknik modüler ve test edilebilir Django uygulaması sürdürmeye yardımcı olur:

  • [FONT:0) Django'nun inşa edilmiş sinyalleri, ile hafifçe bağdaştırılabilir ve sinyale dayalı mantık üzerinde servis yöntemleri tercih edebilir.
  • [[Dönetici:0) URL'leri temiz tutun[Dönetici: 1 ) - Uygulamada URL desenleri organize edin, adı alanları kullanın ve karmaşık mantık takmadan kaçının.
  • [FONT:0]Köyüş kaygıları için orta dikkat orta dikkat edin[[[Dönlendirme: 1 ) - Kimlik, giriş ve talep doğrulama orta dikkat için iyi adaylardır. Orta dikkat ve test edilebilir.
  • [[Dönemli yazı ve yazı yazma ipuçları[[[Dönemli) - Tip annotasyonlarla kod yazmak ve yeniden faktörlemeyi kolaylaştırmak için daha kolaydır. Python'un [[ENFLT:22) modülü kullanın ve statik analiz için araçları düşünün.
  • [FONT=0]Adopt a consistent kodlama stili[[Dönder:)[[Dönder:0)[Köpektif bir kodlama stili[[Dönder: 1 ) – PEP 8'i takip edin, linters (flake8, pylint) ve formatt (kara, isort). Bu, bilişsel yükü azaltır ve kod yorumları pürüzsüz hale getirir.

Gerçek Dünya Örneği: Django'da Modüler MVC ile Blog Oluşturun

Basit bir blog uygulamasına ilkeleri uygulayalım. Bir örnek tanımlayacağız, geçerli olan mesajları oluşturmak için bir hizmet, listelere dayalı bir bakış ve yazı oluşturmak için bir şablon oluşturacağız.

[FONT:0) Model[Dönem:0)[Dönem:0)[[Dönem:0)

from django.db import models
from django.urls import reverse

class Post(models.Model):
 title = models.CharField(max_length=200)
 content = models.TextField()
 published = models.BooleanField(default=False)
 created_at = models.DateTimeField(auto_now_add=True)

 def get_absolute_url(self):
 return reverse('post_detail', args=[self.pk])

[FONT:0)[[Dönemli))

from .models import Post

class PostService:
 def create_post(self, title, content, user):
 # business logic: check permissions, validate content length, etc.
 if len(content) < 50:
 raise ValueError("Content must be at least 50 characters.")
 post = Post.objects.create(title=title, content=content, author=user)
 return post

[FONT:0)View[DÜDÜDÜŞÜNÜŞÜNÜye:

from django.views.generic import ListView, CreateView
from django.contrib.auth.mixins import LoginRequiredMixin
from .services import PostService
from .models import Post

class PostListView(ListView):
 model = Post
 template_name = 'blog/post_list.html'
 queryset = Post.objects.filter(published=True)

class PostCreateView(LoginRequiredMixin, CreateView):
 model = Post
 fields = ['title', 'content']
 template_name = 'blog/post_form.html'

 def form_valid(self, form):
 # Use service to enforce additional rules
 service = PostService()
 try:
 post = service.create_post(
 title=form.cleaned_data['title'],
 content=form.cleaned_data['content'],
 user=self.request.user
 )
 except ValueError as e:
 form.add_error(None, str(e))
 return self.form_invalid(form)
 return super().form_valid(form)

[FONT:0]Template[[DÜDÜDÜDÜDÜDÜŞÜNÜye: “[Üye Olmayanlar)

{% extends "base.html" %}
{% block content %}
 {% for post in post_list %}
 
 {% endfor %}
{% endblock %}

This structure keeps the view lean, the model focused, and the business logic isolated in a service that can be unit-tested easily.

Blog Servisini Test Etmek

İşte veritabanı vuruşlarından kaçınmak için alay objeleri kullanarak (aynı zamanda Django'nun test veritabanını entegrasyon için kullanabilirsiniz):

from django.test import TestCase
from unittest.mock import patch, MagicMock
from .services import PostService

class PostServiceTest(TestCase):
 @patch('blog.services.Post.objects.create')
 def test_create_post_short_content_raises_error(self, mock_create):
 service = PostService()
 with self.assertRaises(ValueError):
 service.create_post("Title", "Short", mock_some_user)
 mock_create.assert_not_called()

Daha ayrıntılı testler için Django'nun “DÜDÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜ

Dış Tavsiyeler

MVC'yi Django'da ve ilgili test uygulamaları hakkında derinleştirmek için, bu kaynakları keşfedin:

  • [FONT:0]Django Model katmanı Belgeleri) - Modeller, alanlarda ve ilişkiler üzerine resmi kılavuz.
  • [FONT:0]Django sınıf tabanlı görüş belgeleri) - jenerik görüşlerin ayrıntılı açıklaması ve bunları nasıl özelleştireceğinizi.
  • [[Django test belgeleri) - Test müşterisini, test veritabanını ve ileri teknikleri kapsar.
  • [FONT=0)Obey the Test Goat (Test-Driven Web Development with Python))[değiştir | kaynağı değiştir], TDD'de modüler tasarımı güçlendiren mükemmel bir kitap.

Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç

Django'daki MVC modelini uygulamak, ders tanımlarını katı bir şekilde takip etmekle ilgili değildir, ancak endişelerin ayrılığını benimsemek için temel fikrini benimsemek. Django'nun modellerini veri gösterimi, görüntüleme katmanı olarak tedavi etmek, ve şablonları doğal olarak daha modüler ve test edilebilir bir uygulama inşa etmek.Bir hizmet katmanını tanıtmak için hızlı bir birim testlerini yazmak ve gereksinimleri değiştirmek kolay hale getirmek.

Projeleriniz büyüdükçe, bu ilkeler daha değerli hale gelir. İyi yapılandırılmış bir Django kodubase teknik borcu azaltır ve yeni geliştiriciler için gemide hazır hale getirir ve uygulamanızın MVC'nin ruhu olmadan gelişebileceğini sağlar.