Django: “projeler” ve “uygulamalar”


203

Oldukça karmaşık bir "ürünüm" var Django'yu kullanarak inşa etmeye hazırlanıyorum. Bu bağlamda "proje" ve "uygulama" terimlerini kullanmaktan kaçınacağım, çünkü Django'daki özel anlamları konusunda net değilim.

Projelerin birçok uygulaması olabilir. Uygulamalar birçok proje arasında paylaşılabilir. İnce.

Blogu veya forumu yeniden icat etmiyorum - ürünümün hiçbir kısmının herhangi bir bağlamda tekrar kullanılabilir olduğunu görmüyorum. Sezgisel olarak, buna "uygulama" diyorum. Daha sonra tüm işlerimi tek bir "uygulama" klasöründe mi yapabilirim?

Eğer öyleyse ... Django'nun project.appisim alanı açısından , benim eğimim kullanmak myproduct.myproduct, ama elbette buna izin verilmiyor (ama inşa ettiğim uygulama benim projem ve projem bir uygulamadır!). Bu nedenle, belki de "önemli" model başına bir uygulama oluşturarak Django'ya yaklaşmam gerektiğine inanıyorum, ancak uygulamalara ayırmak için şemamdaki sınırları nereye çizeceğimizi bilmiyorum - çok şeyim var karmaşık ilişkilere sahip modeller.

Bunun ortak bir çözümü olduğunu umuyorum ...


1
Dokümanlar burada "uygulama" ve "proje" arasındaki farkı açıklıyor: docs.djangoproject.com/en/dev/ref/applications/…
guettli

Yanıtlar:


56

Kullanmanıza engel olan nedir myproduct.myproduct? Bunu başarmak için ihtiyacınız olan şey kabaca bunu yapmaktan ibarettir:

django-admin.py startproject myproduct
cd myproduct
mkdir myproduct
touch myproduct/__init__.py
touch myproduct/models.py
touch myproduct/views.py

ve bunun gibi. Söylediğim takdirde yardım eder misiniz views.pyçağrılacak zorunda değildir views.py? Python yolunda, bir işlevi (genellikle package.package.views.function_name) isimlendirebilmeniz koşuluyla, ele alınacaktır. Bu kadar basit. Tüm bu "proje" / "uygulama" şeyler sadece python paketleri.

Şimdi, bunu nasıl yapman gerekiyor? Ya da daha doğrusu nasıl yapabilirim? Eğer yeniden işlevsellik önemli parçasını oluşturmak buysa, böyle bir "üst düzey app" oluştururken içeriyor olabilir olduğunu, bir biçimlendirme editörü demek widgets.py, fields.py, context_processors.pyher şeyi İçe isteyebilirsiniz - vb.

Benzer şekilde, yüklemeler arasında oldukça genel bir biçimde bir blog gibi bir şey oluşturabilirseniz, bunu kendi şablonu, statik içerik klasörü vb.İle bir uygulamada tamamlayabilir ve bunu kullanmak için bir django projesinin örneğini yapılandırabilirsiniz. uygulamanın içeriği.

Bunu yapmanız gerektiğini söyleyen zor ve hızlı kurallar yoktur, ancak çerçevenin amaçlarından biridir. Şablonların dahil olduğu her şeyin, bazı ortak tabanlardan dahil etmenize izin vermesi, blogunuzun sadece kendi kısmına bakarak diğer herhangi bir düzene tam olarak sığması gerektiği anlamına gelir.

Ancak, asıl endişenizi gidermek için, evet, hiçbir şey en üst düzey proje klasörüyle çalışamayacağınızı söylemez. Uygulamaların yaptığı budur ve gerçekten isterseniz bunu yapabilirsiniz. Bununla birlikte, birkaç nedenden dolayı:

  • Django'nun varsayılan kurulumu bunu yapmaz.
  • Genellikle, ana bir uygulama oluşturmak istiyorum, bu yüzden genellikle denilen bir uygulama oluşturuyorum website. Ancak, daha sonraki bir tarihte yalnızca bu site için özgün işlevler geliştirmek isteyebilirim. Çıkarılabilir hale getirmek için (hiç yapsam da yapmasam da) ayrı bir dizin oluşturma eğilimindeyim. Bu ayrıca, genel bir urls.py klasöründen doğru URL'leri karmaşık bir silmek yerine, bu paketin yapılandırma ile bağlantısını kesip klasörü kaldırarak söz konusu işlevselliği bırakabileceğim anlamına gelir.
  • Çok sık, bağımsız bir şey yapmak istesem bile, bakarken / bağımsız kılmak için yaşamak için bir yere ihtiyacı vardır. Temelde yukarıdaki durum, ama şeyler için genel yapmak niyetinde.
  • Üst düzey klasörüm genellikle wsgi komut dosyaları, sql komut dosyaları vb. Dahil ancak bunlarla sınırlı olmamak üzere birkaç şey daha içerir.
  • django'nun yönetim uzantıları alt dizinlere dayanır. Bu nedenle paketleri uygun şekilde adlandırmak mantıklıdır.

Kısacası, bir sözleşmenin nedeni diğer sözleşmelerle aynıdır - projenizle çalışan başkalarına gelince yardımcı olur. Ben görürseniz fields.pyhemen ben görürsem oysa, Django alanını alt sınıfı diye içeri kodu bekliyoruz inputtypes.pybunu bakmadan 'ne anlama geldiğini bu konuda çok net olmayabilir.


24
+1 ... "myproduct.myproduct 'i kullanmanıza engel olan nedir?" - Django'nun "startapp" komutu aslında bir kongre olarak sizi durdurdu. Sözleşmeleri, özellikle bir ekip çalışması bağlamında seviyorum, ama arkasındaki mantığı anlamayı tercih ediyorum :)
Dolph

@Dolph ah, öyle mi? İlk kez kullandığımdan beri kullanmadım, çünkü önce modeller oluşturan, sonra bu modeller için otomatik olarak CRUD şeyler üreten bir proje oluşturmak için kendi komutum var. Yine de, evet sözleşmeler iyidir. Django sözleşmelerini sadece büyük ölçüde konuştukları için mantıklı oldukları için takip ediyorum.

1
Bir proje ve içindeki bir uygulama için aynı adı kullanmanın da sorunlara manage.pyneden olacağını ve proje ayarlarınızı doğru bir şekilde alamamasına neden olacağını ekleyeceğim . Bu benim başıma geldi ve ben uygulamanın etkisini yeniden düzenleyerek çözdüm myproduct_app.
BHSPitMonkey

90

Kullandığınız mezun kez startprojectve startappaynı Python paketinde bir "proje" ve "app" birleştirerek sizi durdurmak için hiçbir şey yok. Bir proje gerçekten bir settingsmodülden başka bir şey değildir ve bir uygulama gerçekten bir modelsmodülden başka bir şey değildir - diğer her şey isteğe bağlıdır.

Küçük siteler için aşağıdaki gibi bir şeye sahip olmak tamamen mantıklıdır:

site/
    models.py
    settings.py
    tests.py
    urls.py
    views.py

18
+1 Özet: projede settings.py, uygulamada models.py var. Aynı seviyedeki yapılardır. Projenin uygulamadan bir seviye daha yüksek olduğunu düşünürdüm, sanırım yanılmışım
Philip007

2
@claymation, 'python manage.py makemigrations' veya 'python manage.py migrate' dosyasının 'ürünüm' dizinindeki 'models.py' dosyasını görmesine izin vermek için ayarlara (uygulama olarak) ne dahil edilmelidir?
mlwn

1
@mlwn Bunu cevaplamak için çok geç olduğumu fark ettim ama kendime benzer bir durumdayım ve birçok cevaba bakıyorum. Sorunuzu cevaplamak için tek yapmanız gereken projenizi INSTALLED_APPSlisteye dahil etmek . İşte bir örnek: stackoverflow.com/a/59739912/399435
Karthic Raghupathi

@KarthicRaghupathi, Teşekkürler .. :) dört yıl sonra yanıtlanan yorumları görmek güzel .. şerefe
mlwn

69

"Başvurum ne işe yarar?" Sorusunu yanıtlamaya çalışın. Tek bir cümleyle cevap veremezseniz, daha temiz bir mantıkla birkaç uygulamaya bölebilirsiniz.

Django ile çalışmaya başladıktan kısa bir süre sonra bu düşünceyi bir yerde okudum ve kendime bu soruyu sık sık soruyorum ve bana yardımcı oluyor.

Uygulamalarınızın yeniden kullanılabilir olması gerekmez, birbirlerine bağımlı olabilirler, ancak bir şey yapmalıdırlar.


8
Kendi uygulamamı düzenlemeye gelince hala biraz mücadele ediyorum. Ana uygulamamın biraz ağır olduğunu hissediyorum, ama aynı zamanda, gevşek bir şekilde birleştirilmiş bir şeye benzemeye yakın bir şeye yeniden odaklanamazdım. Ana büyük varlıklarımın hala birbirine büyük ölçüde bağlı olmaları ve ufukta yeniden kullanılmaları veya genelleştirilmelerine gerek kalmazsa, büyük ana varlıklarımın ayrılmasının gerçekten bir gelişme olmayacağını düşünmeye yöneliyorum. Ben "erken optimize etmeyin" bir yorum olarak "erken refactor yok" doğru eğilerek
acjay


8

Eğer öyleyse ... Django'nun project.app ad alanı açısından, eğim usemyproduct.myproduct, ama elbette buna izin verilmiyor

İzin verilmeyen bir şey yok. Bu senin projen, kimse seni kısıtlamıyor. Makul bir isim tutmanız tavsiye edilir.

Ürünümün hiçbir kısmının herhangi bir bağlamda tekrar kullanılabilir olduğunu görmüyorum. Sezgisel olarak, buna "uygulama" diyorum. Daha sonra tüm işlerimi tek bir "uygulama" klasöründe mi yapabilirim?

Genel bir django projesinde, her projede gerçekten kullanılan birçok uygulama (katkıda bulunan uygulamalar) vardır.

Projenizin sadece bir görev yaptığını ve sadece tek bir uygulaması olduğunu mainsöyleyelim (projenin etrafında dönerken ve takılmaz olduğu için bunu adlandırıyorum). Bu proje de hala diğer bazı uygulamaları kullanıyor.

Şimdi eğer projeniz sadece bir uygulamayı ( INSTALLED_APPS='myproduct') kullanıyorsa project, projeyi tanımlamanın ne faydası project.appolduğunu söylüyorsanız, bazı noktaları göz önünde bulundurmanız gerektiğini düşünüyorum:

  • Bir projede uygulama dışında kodun işlediği başka birçok şey vardır (temel statik dosyalar, temel şablonlar, ayarlar .... yani temel sağlar).
  • Genel project.app yaklaşımında django, modellerden sql şemasını otomatik olarak tanımlar.
  • Projenizi geleneksel yaklaşımla inşa etmek çok daha kolay olurdu.
  • URL'ler, görünümler ve diğer dosyalar için istediğiniz gibi farklı adlar tanımlayabilirsiniz, ancak ihtiyacını görmüyorum.
  • Gelecekte, eşit veya daha zor ve sıkıcı hale gelebilecek geleneksel django projeleri ile gelecekte gerçekten kolay olacak bazı uygulamalar eklemeniz gerekebilir.

Uygulamada yapılan işlerin çoğuna gelince, django projelerinin çoğunda durum bence.


1
+1, mainkongre için esp - bunun gibi orijinal bir proje için bana çok mantıklı geliyor. Daha sonra "yeniden kullanılabilir" uygulamalar eklemeyi planlıyorum, ancak şu anda odak noktamın çok dışında.
Dolph

2

Burada Django yaratıcıları bu farkın kendilerine dikkat çekiyor . Onlar olmak zorunda gibi Apps ile ilgili bu düşünceyi düşünmek yeniden kullanılabilir diğer projelerde olduğu iyi . Ayrıca Django Apps hakkında düşünmek için iyi bir yol, modern web uygulamaları sağlar.

JavaScript tabanlı büyük dinamik web uygulaması oluşturduğunuzu düşünün .

Daha sonra, örneğin "FrontEnd" <adlı django uygulamasında oluşturabilirsiniz - bu uygulamada içerik görüntüler.

Sonra bazı arka uç Uygulamaları oluşturun. Örneğin, kullanıcı yorumlarını saklayacak "Yorumlar" adlı uygulama. Ve "Yorumlar" Uygulama hiçbir şey kendisini göstermez. Dinamik JS web sitenizin AJAX istekleri için yalnızca API olacaktır .

Bu şekilde her zaman "Yorumlar" uygulamanızı yeniden kullanabilirsiniz. Tüm projenin kaynağını açmadan açık kaynak yapabilirsiniz. Ve projenizin temiz mantığını sürdürüyorsunuz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.