Saya baru saja mulai belajar Django / Python / Pengembangan Web. Masalah ini telah mengganggu saya untuk sementara waktu sekarang.
Saya membuat aplikasi dengan banyak templat di Django. Saya memiliki views.py yang pada dasarnya hanya memberikan tanggapan ke masing-masing template dan saya memiliki models.py di mana saya menyusun DB saya. Di salah satu templat saya, saya perlu mengunggah gambar (yang dapat saya lakukan) dan saya perlu menjalankan logika yang didasarkan pada fitur-fitur gambar yang diunggah (belum selesai). Logika ini melibatkan banyak perhitungan yang berat. Setelah melakukan perhitungan, logika harus mengembalikan beberapa informasi yang diproses (koordinat) ke template.
Saya telah berhasil melakukan semua tindakan ini dengan sukses dalam aplikasi desktop python mandiri yang memanggil file python satu demi satu. Namun, karena sekarang saya ingin menjadikan ini aplikasi web, saya sudah mulai menggunakan kerangka Django.
Saya telah melakukan banyak pencarian tetapi saya masih belum dapat menemukan di mana tepatnya saya harus meletakkan file Python ini yang berisi semua logika. Haruskah saya memiliki file berbasis kelas lain (logic.py)
dan memanggilnya dari view.py
? Saya mencari di Google dan menemukan bahwa banyak pengembang menempatkan logika bisnis mereka di models.py mereka di Django. Namun, saya merasa itu secara intuitif tidak benar karena model harus secara eksklusif berkomunikasi dengan bagian belakang. Bantuan apa pun akan dihargai. Terima kasih sebelumnya.
Jawaban:
Ada sejumlah opsi, tergantung pada apa kebutuhan Anda:
Tambahkan logika ke misalnya
Image
model. Ini adalah opsi yang berguna jika Anda perlu menyimpan meta data per-gambar dalam database, dan setiap contoh model (setiap gambar) diproses dengan sendirinya.Tambahkan logika sebagai
Image
kelas Python biasa , misalnya dalam file bernamaimage.py
. Tidak ada dalam Django yang membatasi Anda untuk menambahkan logika selain dari pada modulviews
ataumodels
. Ini adalah pilihan yang baik jika logika gambar adalah komponen utama dari aplikasi Django Anda (misalnya aplikasi pemrosesan Gambar).Buat proyek Python terpisah yang menyediakan logika, lalu panggil dari pandangan Anda. Pastikan untuk menginstal proyek ini di lingkungan Python aplikasi Django Anda. Opsi ini berlaku jika tujuan aplikasi Django Anda adalah untuk mengunggah dan melihat gambar, atau untuk menunjukkan hasil pemrosesan gambar sebagai respons langsung terhadap permintaan pengguna, tetapi di mana pemrosesan gambar dapat digunakan oleh proyek lain juga.
Buat aplikasi terpisah yang memproses permintaan secara tidak sinkron dan dijalankan secara terpisah dari aplikasi Django Anda. Opsi ini berguna jika Anda perlu memisahkan pemrosesan gambar dari siklus permintaan aplikasi, memproses sejumlah besar gambar, atau di mana setiap perhitungan membutuhkan terlalu banyak waktu untuk diselesaikan dalam waktu siklus permintaan (mis. Paling banyak dalam 500ms hingga 1s) .
Tidak ada dalam Django yang membutuhkan model untuk berkomunikasi dengan back end, atau lebih tepatnya database. Saya pikir Anda mencampur semantik dari apa yang biasanya dianggap Django model (yaitu, abstraksi dari satu atau beberapa tabel dalam database), vs istilah model sebagai konstruksi desain (misalnya seperti dalam Desain Domain Driven).
sumber
Daniel Greenfeld, penulis bersama "Two Scoops of Django, merekomendasikan logika bisnis harus dalam model" jika memungkinkan, atau dalam bentuk jika Anda harus. "Adapun kemungkinan duplikat Bart, Django mungkin mirip dengan MVC tetapi itu adalah bukan MVC. Seperti dijelaskan di sini di faq dokumentasi Django resmi . @adrita, saya pikir Anda perlu meninjau dokumentasi resmi untuk membantu Anda memahami konsep model, tampilan, dan templat sedikit lebih baik.
sumber
Dalam dokumen resmi Django https://docs.djangoproject.com/en/1.11/ , dikatakan:
Django merekomendasikan logika untuk dimuat dalam pandangan.
sumber
Model.clean()
) tersirat sedikit lebih eksplisit bahwa (jika kita hanya proyek Django dunia nyata untuk model, template, dan pandangan) - logika bisnis (atau paling tidak, validasi) termasuk dalam lapisan model. Perhatikan bahwa saya tidak menyertakan formulir dalam penyederhanaan itu, yang juga dapat diterima.