Django: "proyek" vs "aplikasi"

202

Saya memiliki "produk" yang cukup kompleks. Saya sedang bersiap untuk membangun menggunakan Django. Saya akan menghindari penggunaan istilah "proyek" dan "aplikasi" dalam konteks ini, karena saya tidak jelas tentang arti khusus mereka di Django.

Proyek dapat memiliki banyak aplikasi. Aplikasi dapat dibagikan di antara banyak proyek. Baik.

Saya tidak menciptakan kembali blog atau forum - Saya tidak melihat ada bagian dari produk saya yang dapat digunakan kembali dalam konteks apa pun. Secara intuitif, saya akan menyebut ini "aplikasi." Apakah saya kemudian melakukan semua pekerjaan saya dalam satu folder "aplikasi"?

Jika demikian ... dalam hal project.appnamespace Django , kecenderungan saya adalah menggunakanmyproduct.myproduct , tetapi tentu saja ini tidak diperbolehkan (tapi aplikasi yang saya bangun adalah proyek saya, dan proyek saya adalah aplikasi!). Karena itu saya percaya bahwa mungkin saya seharusnya mendekati Django dengan membangun satu aplikasi per model "signifikan", tetapi saya tidak tahu di mana harus menggambar batas-batas dalam skema saya untuk memisahkannya ke dalam aplikasi - Saya punya banyak model dengan hubungan yang relatif kompleks.

Saya berharap ada solusi umum untuk ini ...

Dolph
sumber
1
Dokumen menjelaskan perbedaan antara "aplikasi" dan "proyek" di sini: docs.djangoproject.com/en/dev/ref/applications/…
guettli

Jawaban:

56

Apa yang menghentikan Anda menggunakan myproduct.myproduct? Apa yang perlu Anda capai yang secara kasar terdiri dari melakukan ini:

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

dan seterusnya. Apakah akan membantu jika saya mengatakan views.pytidak perlu dipanggil views.py? Asalkan Anda bisa memberi nama, di jalur python, fungsi (biasanya package.package.views.function_name) itu akan ditangani. Sederhana seperti itu. Semua "proyek" / "aplikasi" ini hanyalah paket python.

Sekarang, bagaimana Anda melakukannya? Atau lebih tepatnya, bagaimana saya bisa melakukannya? Nah, jika Anda membuat sepotong signifikan fungsi dapat digunakan kembali, seperti mengatakan editor markup, saat itulah Anda membuat "tingkat atas aplikasi" yang mungkin berisi widgets.py, fields.py,context_processors.py dll - semua hal yang Anda mungkin ingin impor.

Demikian pula, jika Anda dapat membuat sesuatu seperti blog dalam format yang cukup umum di seluruh pemasangan, Anda dapat membungkusnya dalam suatu aplikasi, dengan templat sendiri, folder konten statis dll, dan mengonfigurasikan instance dari proyek Django untuk menggunakannya konten aplikasi.

Tidak ada aturan keras dan cepat yang mengatakan Anda harus melakukan ini, tetapi itu adalah salah satu tujuan kerangka kerja ini. Fakta bahwa semuanya, termasuk template, memungkinkan Anda untuk memasukkan dari beberapa basis umum berarti blog Anda harus pas dengan pengaturan lain, hanya dengan menjaga bagiannya sendiri.

Namun, untuk mengatasi masalah Anda yang sebenarnya, ya, tidak ada yang mengatakan Anda tidak dapat bekerja dengan folder proyek tingkat atas. Itulah yang dilakukan aplikasi dan Anda dapat melakukannya jika Anda benar-benar menginginkannya. Namun saya cenderung tidak, karena beberapa alasan:

  • Pengaturan default Django tidak melakukannya.
  • Seringkali, saya ingin membuat aplikasi utama, jadi saya membuatnya, biasanya disebut website. Namun, di kemudian hari saya mungkin ingin mengembangkan fungsionalitas asli hanya untuk situs ini. Dengan maksud untuk membuatnya dapat dilepas (apakah saya pernah melakukannya atau tidak) saya cenderung kemudian membuat direktori terpisah. Ini juga berarti saya dapat menghapus fungsionalitas tersebut hanya dengan memutus tautan paket itu dari konfigurasi dan menghapus folder, daripada menghapus url yang tepat dari folder global urls.py.
  • Sangat sering, bahkan ketika saya ingin membuat sesuatu mandiri, perlu tempat tinggal sementara saya menjaganya / membuatnya mandiri. Pada dasarnya kasus di atas, tetapi untuk hal-hal yang saya lakukan bermaksud membuat generik.
  • Folder tingkat atas saya sering berisi beberapa hal lain, termasuk tetapi tidak terbatas pada skrip wsgi, skrip sql, dll.
  • ekstensi manajemen django bergantung pada subdirektori. Jadi masuk akal untuk memberi nama paket dengan tepat.

Singkatnya, alasan ada konvensi sama dengan konvensi lainnya - ini membantu ketika berbicara dengan orang lain yang bekerja dengan proyek Anda. Jika saya melihat fields.pysaya langsung berharap kode di dalamnya untuk subclass bidang Django, sedangkan jika saya melihat inputtypes.pysaya mungkin tidak begitu jelas tentang apa artinya tanpa melihatnya.


sumber
24
+1 ... "Apa yang menghentikan Anda menggunakan myproduct.myproduct?" - Perintah "startapp" Django benar-benar menghentikan Anda, saya kira, sebagai sebuah konvensi. Saya suka konvensi, terutama dalam konteks upaya tim, tetapi saya lebih suka memahami logika di belakangnya :)
Dolph
@ Dolph ah, bukan? Saya belum menggunakannya sejak pertama kali saya menggunakannya karena saya memiliki perintah sendiri untuk membuat proyek yang pertama kali membuat model kemudian otomatis menghasilkan barang CRUD untuk model ini. Tetap saja, konvensi itu bagus. Saya mengikuti konvensi Django jika hanya karena sebagian besar berbicara mereka masuk akal.
1
Saya akan menambahkan bahwa menggunakan nama yang sama untuk suatu proyek dan aplikasi di dalamnya juga menyebabkan masalah manage.py, sehingga tidak dapat mengimpor pengaturan proyek Anda dengan benar. Ini terjadi pada saya, dan saya menyelesaikannya dengan refactoring aplikasi myproduct_app.
BHSPitMonkey
89

Setelah Anda lulus dari menggunakan startprojectdan startapp, tidak ada yang menghentikan Anda untuk menggabungkan "proyek" dan "aplikasi" dalam paket Python yang sama. Sebuah proyek benar-benar tidak lebih dari sebuah settingsmodul, dan sebuah aplikasi benar-benar tidak lebih dari sebuah modelsmodul — semua yang lain adalah opsional.

Untuk situs kecil, sepenuhnya masuk akal untuk memiliki sesuatu seperti:

site/
    models.py
    settings.py
    tests.py
    urls.py
    views.py
claymation
sumber
18
Ringkasan +1: proyek memiliki settings.py, aplikasi memiliki models.py. Mereka adalah struktur tingkat yang sama. Saya dulu berpikir proyek adalah satu tingkat lebih tinggi dari aplikasi, saya kira saya salah
Philip007
2
@claymation, apa yang harus dimasukkan dalam pengaturan (sebagai aplikasi) untuk memungkinkan 'python manage.py makemigrations' atau 'python manage.py migrate' untuk melihat file 'models.py' di direktori 'my product'?
mlwn
1
@mlwn Saya menyadari bahwa saya sangat telat dalam menjawab hal ini tetapi saya sendiri dalam situasi yang sama dan saya telah melihat banyak jawaban. Untuk menjawab pertanyaan Anda, yang perlu Anda lakukan adalah memasukkan proyek Anda dalam INSTALLED_APPSdaftar. Berikut ini sebuah contoh: stackoverflow.com/a/59739912/399435
Karthic Raghupathi
@KarthicRaghupathi, Terima kasih .. :) senang melihat komentar dijawab setelah empat tahun .. tepuk tangan
mlwn
69

Coba jawab pertanyaan: "Apa yang dilakukan aplikasi saya?". Jika Anda tidak dapat menjawab dalam satu kalimat, maka mungkin Anda dapat membaginya menjadi beberapa aplikasi dengan logika bersih.

Saya membaca pemikiran ini di suatu tempat segera setelah saya mulai bekerja dengan Django dan saya menemukan bahwa saya cukup sering mengajukan pertanyaan ini pada diri saya dan itu membantu saya.

Aplikasi Anda tidak harus dapat digunakan kembali, mereka dapat saling bergantung, tetapi mereka harus melakukan satu hal.

Main ski
sumber
8
Saya masih berjuang sedikit ketika harus meletakkan aplikasi saya sendiri. Saya merasa seperti aplikasi utama saya agak berat, tetapi pada saat yang sama, saya tidak akan dapat mengubahnya menjadi sesuatu yang mirip dengan sesuatu yang digabungkan secara longgar. Saya condong ke arah berpikir bahwa tidak akan benar-benar perbaikan untuk memisahkan entitas utama utama saya, jika mereka masih sangat bergantung satu sama lain, dan tidak perlu menggunakan kembali atau menggeneralisasi di cakrawala. Saya condong ke arah "jangan prematur refactor" sebagai interpretasi dari "jangan optimalkan prematur"
acjay
8

Jika demikian ... dalam hal ruang proyek Django. App namesapp, kecenderungan saya adalah untuk menggunakan produk saya. Produk, tapi tentu saja ini tidak diperbolehkan

Tidak ada yang seperti tidak diizinkan. Ini proyek Anda, tidak ada yang membatasi Anda. Dianjurkan untuk menyimpan nama yang masuk akal.

Saya tidak melihat sebagian produk saya dapat digunakan kembali dalam konteks apa pun. Secara intuitif, saya akan menyebut ini "aplikasi." Apakah saya kemudian melakukan semua pekerjaan saya dalam satu folder "aplikasi"?

Dalam proyek Django umum ada banyak aplikasi (aplikasi contrib) yang benar-benar digunakan dalam setiap proyek.

Katakanlah proyek Anda hanya melakukan satu tugas dan hanya memiliki satu aplikasi (saya mainberi nama karena proyek ini berputar di sekitarnya dan sulit dicolokkan). Proyek ini juga masih menggunakan beberapa aplikasi lain pada umumnya.

Sekarang jika Anda mengatakan bahwa proyek Anda menggunakan hanya satu aplikasi ( INSTALLED_APPS='myproduct') jadi apa gunanya projectmendefinisikan proyek sebagai project.app, saya pikir Anda harus mempertimbangkan beberapa poin:

  • Ada banyak hal lain yang kode selain aplikasi dalam menangani proyek (basis file statis, templat basis, pengaturan .... yaitu menyediakan basis).
  • Dalam pendekatan project.app umum, Django secara otomatis mendefinisikan skema sql dari model.
  • Proyek Anda akan jauh lebih mudah dibangun dengan pendekatan konvensional.
  • Anda dapat menentukan beberapa nama berbeda untuk url, tampilan, dan file lain seperti yang Anda inginkan, tetapi saya tidak melihat perlunya.
  • Anda mungkin perlu menambahkan beberapa aplikasi di masa depan yang akan sangat mudah dengan proyek Django konvensional yang jika tidak maka akan menjadi sama atau lebih sulit dan membosankan untuk dilakukan.

Sejauh sebagian besar pekerjaan yang dilakukan dalam aplikasi terkait, saya pikir itu adalah kasus dengan sebagian besar proyek Django.

crodjer
sumber
1
+1, esp untuk mainkonvensi - itu masuk akal bagi saya untuk proyek asli seperti ini. Saya berencana menambahkan aplikasi "yang dapat digunakan kembali" nanti, tapi itu jauh di luar fokus saya sekarang.
Dolph
2

Di sini pencipta Django menunjukkan perbedaan itu sendiri . Saya pikir berpikir tentang Aplikasi karena harus digunakan kembali dalam proyek lain adalah baik . Juga cara berpikir yang baik tentang Aplikasi di Django menyediakan aplikasi web modern.

Bayangkan Anda membuat aplikasi web dinamis besar berdasarkan JavaScript .

Anda dapat membuat kemudian di App Django bernama misalnya "FrontEnd" <- dalam aplikasi Thins Anda akan menampilkan konten.

Kemudian Anda membuat beberapa Aplikasi backend. Misalnya Aplikasi bernama "Komentar" yang akan menyimpan komentar pengguna. Dan "Komentar" Aplikasi tidak akan menampilkan apa pun itu sendiri. Itu hanya API untuk permintaan AJAX dari situs web JS dinamis Anda .

Dengan cara ini Anda selalu dapat menggunakan kembali aplikasi "Komentar" Anda. Anda dapat menjadikannya open source tanpa membuka sumber seluruh proyek. Dan Anda menjaga logika proyek Anda tetap bersih .

Qback
sumber