Django - Panduan Cepat

Django adalah kerangka kerja web Python tingkat tinggi yang mendorong pengembangan cepat dan bersih, desain pragmatis. Django membuatnya lebih mudah untuk membangun aplikasi web yang lebih baik dengan cepat dan dengan lebih sedikit kode.

Note - Django adalah merek dagang terdaftar dari Django Software Foundation, dan dilisensikan di bawah Lisensi BSD.

Sejarah Django

  • 2003 - Dimulai oleh Adrian Holovaty dan Simon Willison sebagai proyek internal di surat kabar Lawrence Journal-World.

  • 2005 - Dirilis Juli 2005 dan menamakannya Django, diambil dari nama gitaris jazz Django Reinhardt.

  • 2005 - Cukup dewasa untuk menangani beberapa situs dengan lalu lintas tinggi.

  • Current - Django sekarang menjadi proyek sumber terbuka dengan kontributor di seluruh dunia.

Django - Filosofi Desain

Django hadir dengan filosofi desain berikut -

  • Loosely Coupled - Django bertujuan untuk membuat setiap elemen tumpukannya independen dari yang lain.

  • Less Coding - Lebih sedikit kode sehingga pada gilirannya pengembangan cepat.

  • Don't Repeat Yourself (DRY) - Semuanya harus dikembangkan hanya di satu tempat saja, bukan diulangi lagi dan lagi.

  • Fast Development - Filosofi Django adalah melakukan semua yang dapat dilakukan untuk memfasilitasi pengembangan yang sangat cepat.

  • Clean Design - Django secara ketat memelihara desain bersih di seluruh kodenya sendiri dan membuatnya mudah untuk mengikuti praktik pengembangan web terbaik.

Keuntungan dari Django

Berikut adalah beberapa keuntungan menggunakan Django yang dapat didaftar di sini -

  • Object-Relational Mapping (ORM) Support- Django menyediakan jembatan antara model data dan mesin database, dan mendukung sekumpulan besar sistem database termasuk MySQL, Oracle, Postgres, dll. Django juga mendukung database NoSQL melalui garpu Django-nonrel. Untuk saat ini, satu-satunya database NoSQL yang didukung adalah MongoDB dan mesin aplikasi google.

  • Multilingual Support- Django mendukung situs web multibahasa melalui sistem internasionalisasi bawaannya. Jadi Anda dapat mengembangkan situs web Anda, yang akan mendukung banyak bahasa.

  • Framework Support - Django memiliki dukungan built-in untuk Ajax, RSS, Caching dan berbagai kerangka kerja lainnya.

  • Administration GUI - Django menyediakan antarmuka pengguna siap pakai yang bagus untuk aktivitas administratif.

  • Development Environment - Django hadir dengan server web ringan untuk memfasilitasi pengembangan dan pengujian aplikasi ujung-ke-ujung.

Seperti yang telah Anda ketahui, Django adalah kerangka kerja web Python. Dan seperti kebanyakan kerangka modern, Django mendukung pola MVC. Pertama mari kita lihat apa itu pola Model-View-Controller (MVC), dan kemudian kita akan melihat kekhususan Django untuk pola Model-View-Template (MVT).

Pola MVC

Ketika berbicara tentang aplikasi yang menyediakan UI (web atau desktop), biasanya kita berbicara tentang arsitektur MVC. Dan seperti namanya, pola MVC didasarkan pada tiga komponen: Model, View, dan Controller. Lihat tutorial MVC kami di sini untuk mengetahui lebih lanjut.

DJANGO MVC - Pola MVT

Model-View-Template (MVT) sedikit berbeda dari MVC. Nyatanya perbedaan utama antara dua pola adalah bahwa Django sendiri menangani bagian Pengontrol (Kode Perangkat Lunak yang mengontrol interaksi antara Model dan Tampilan), meninggalkan kita dengan cetakannya. Templatenya adalah file HTML yang dicampur dengan Django Template Language (DTL).

Diagram berikut menggambarkan bagaimana setiap komponen pola MVT berinteraksi satu sama lain untuk melayani permintaan pengguna -

Pengembang menyediakan Model, tampilan dan templat kemudian hanya memetakannya ke URL dan Django melakukan sihir untuk menyajikannya kepada pengguna.

Lingkungan pengembangan Django terdiri dari memasang dan menyiapkan Python, Django, dan Sistem Database. Karena Django berurusan dengan aplikasi web, ada baiknya disebutkan bahwa Anda akan membutuhkan pengaturan server web juga.

Langkah 1 - Menginstal Python

Django ditulis dalam 100% kode Python murni, jadi Anda harus memasang Python pada sistem Anda. Versi Django terbaru membutuhkan Python 2.6.5 atau lebih tinggi untuk cabang 2.6.x atau lebih tinggi dari 2.7.3 untuk cabang 2.7.x.

Jika Anda menggunakan salah satu distribusi Linux atau Mac OS X terbaru, Anda mungkin sudah menginstal Python. Anda dapat memverifikasinya dengan mengetikkan perintah python pada prompt perintah. Jika Anda melihat sesuatu seperti ini, berarti Python sudah diinstal.

$ python
Python 2.7.5 (default, Jun 17 2014, 18:11:42)
[GCC 4.8.2 20140120 (Red Hat 4.8.2-16)] on linux2

Jika tidak, Anda dapat mengunduh dan menginstal versi terbaru Python dari tautan http://www.python.org/download.

Langkah 2 - Menginstal Django

Memasang Django sangatlah mudah, tetapi langkah-langkah yang diperlukan untuk pemasangannya bergantung pada sistem operasi Anda. Karena Python adalah bahasa platform-independen, Django mempunyai satu paket yang bekerja dimanapun terlepas dari sistem operasi Anda.

Anda dapat mengunduh versi terbaru Django dari tautan http://www.djangoproject.com/download.

Instalasi UNIX / Linux dan Mac OS X.

Anda mempunyai dua cara untuk memasang Django jika Anda menjalankan sistem Linux atau Mac OS -

  • Anda dapat menggunakan manajer paket OS Anda, atau menggunakan easy_install atau pip jika diinstal.

  • Instal secara manual menggunakan arsip resmi yang Anda unduh sebelumnya.

Kami akan membahas opsi kedua karena yang pertama tergantung pada distribusi OS Anda. Jika anda telah memutuskan untuk mengikuti pilihan pertama, berhati-hatilah dengan versi Django yang anda pasang.

Katakanlah Anda mendapatkan arsip Anda dari tautan di atas, itu harus seperti Django-x.xx.tar.gz:

Ekstrak dan instal.

$ tar xzvf Django-x.xx.tar.gz
$ cd Django-x.xx $ sudo python setup.py install

Anda dapat menguji instalasi Anda dengan menjalankan perintah ini -

$ django-admin.py --version

Jika anda melihat versi Django saat ini tercetak di layar, maka semuanya telah disetel.

Note - Untuk beberapa versi Django itu akan menjadi django-admin ".py" dihapus.

Instalasi Windows

Kami berasumsi Anda memiliki arsip Django dan python yang diinstal pada komputer Anda.

Pertama, verifikasi PATH.

Pada beberapa versi windows (windows 7) Anda mungkin perlu memastikan variabel sistem Path memiliki jalur berikut C:\Python27\;C:\Python27\Lib\site-packages\django\bin\di dalamnya, tentu saja tergantung pada versi Python Anda.

Kemudian, ekstrak dan instal Django.

c:\>cd c:\Django-x.xx

Selanjutnya, instal Django dengan menjalankan perintah berikut yang akan Anda perlukan hak akses administratif di windows shell "cmd" -

c:\Django-x.xx>python setup.py install

Untuk menguji penginstalan Anda, buka prompt perintah dan ketik perintah berikut -

c:\>django-admin.py --version

Jika anda melihat versi Django saat ini tercetak di layar, maka semuanya telah disetel.

ATAU

Luncurkan prompt "cmd" dan ketik python lalu -

c:\> python
>>> import django
>>> print django.get_version()

Langkah 3 - Pengaturan Database

Django mendukung beberapa mesin basis data utama dan Anda dapat menyetelnya berdasarkan kenyamanan Anda.

  • MySQL (http://www.mysql.com/)
  • PostgreSQL (http://www.postgresql.org/)
  • SQLite 3 (http://www.sqlite.org/)
  • Oracle (http://www.oracle.com/)
  • MongoDb (https://django-mongodb-engine.readthedocs.org)
  • GoogleAppEngine Datastore (https://cloud.google.com/appengine/articles/django-nonrel)

Anda dapat merujuk ke dokumentasi masing-masing untuk menginstal dan mengkonfigurasi database pilihan Anda.

Note - Nomor 5 dan 6 adalah database NoSQL.

Langkah 4 - Server Web

Django hadir dengan server web ringan untuk mengembangkan dan menguji aplikasi. Server ini telah dikonfigurasikan sebelumnya untuk bekerja dengan Django, dan yang lebih penting, restart setiap kali Anda memodifikasi kode.

Bagaimanapun, Django mendukung Apache dan server web populer lainnya seperti Lighttpd. Kami akan membahas kedua pendekatan dalam bab-bab selanjutnya sambil bekerja dengan contoh yang berbeda.

Sekarang kita telah memasang Django, mari mulai menggunakannya. Di Django, setiap aplikasi web yang ingin Anda buat disebut proyek; dan proyek adalah jumlah aplikasi. Aplikasi adalah sekumpulan file kode yang mengandalkan pola MVT. Sebagai contoh katakanlah kita ingin membangun sebuah website, website adalah proyek kami dan forum, berita, mesin kontak adalah aplikasi. Struktur ini memudahkan untuk memindahkan aplikasi antar proyek karena setiap aplikasi bersifat independen.

Buat Proyek

Apakah Anda menggunakan Windows atau Linux, dapatkan terminal atau file cmd prompt dan arahkan ke tempat Anda ingin proyek Anda dibuat, lalu gunakan kode ini -

$ django-admin startproject myproject

Ini akan membuat folder "myproject" dengan struktur berikut -

myproject/
   manage.py
   myproject/
      __init__.py
      settings.py
      urls.py
      wsgi.py

Struktur Proyek

Folder "myproject" hanyalah wadah proyek Anda, ini sebenarnya berisi dua elemen -

  • manage.py- File ini adalah jenis proyek django-admin lokal Anda untuk berinteraksi dengan proyek Anda melalui baris perintah (mulai server pengembangan, sinkronkan db ...). Untuk mendapatkan daftar lengkap dari perintah yang dapat diakses melalui manage.py Anda dapat menggunakan kode -

$ python manage.py help
  • The “myproject” subfolder- Folder ini adalah paket python sebenarnya dari proyek Anda. Ini berisi empat file -

    • __init__.py - Hanya untuk python, perlakukan folder ini sebagai paket.

    • settings.py - Seperti namanya, pengaturan proyek Anda.

    • urls.py- Semua tautan proyek Anda dan fungsi yang akan dipanggil. Semacam ToC proyek Anda.

    • wsgi.py - Jika Anda perlu menyebarkan proyek Anda melalui WSGI.

Menyiapkan Proyek Anda

Proyek Anda disiapkan di subfolder myproject / settings.py. Berikut adalah beberapa opsi penting yang mungkin perlu Anda atur -

DEBUG = True

Opsi ini memungkinkan Anda menyetel apakah proyek Anda dalam mode debug atau tidak. Mode debug memungkinkan Anda mendapatkan lebih banyak informasi tentang kesalahan proyek Anda. Jangan pernah mengaturnya ke 'True' untuk proyek langsung. Bagaimanapun, ini harus diset ke 'True' jika anda ingin server cahaya Django melayani berkas statis. Lakukan hanya dalam mode pengembangan.

DATABASES = {
   'default': {
      'ENGINE': 'django.db.backends.sqlite3',
      'NAME': 'database.sql',
      'USER': '',
      'PASSWORD': '',
      'HOST': '',
      'PORT': '',
   }
}

Database diatur dalam kamus 'Database'. Contoh di atas adalah untuk mesin SQLite. Seperti yang dinyatakan sebelumnya, Django juga mendukung -

  • MySQL (django.db.backends.mysql)
  • PostGreSQL (django.db.backends.postgresql_psycopg2)
  • Oracle (django.db.backends.oracle) dan NoSQL DB
  • MongoDB (django_mongodb_engine)

Sebelum menyetel mesin baru, pastikan Anda telah menginstal driver db yang benar.

Anda juga dapat menyetel opsi lain seperti: TIME_ZONE, LANGUAGE_CODE, TEMPLATE…

Sekarang proyek Anda dibuat dan dikonfigurasi, pastikan itu berfungsi -

$ python manage.py runserver

Anda akan mendapatkan sesuatu seperti berikut saat menjalankan kode di atas -

Validating models...

0 errors found
September 03, 2015 - 11:41:50
Django version 1.6.11, using settings 'myproject.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

Sebuah proyek adalah gabungan dari banyak aplikasi. Setiap aplikasi memiliki tujuan dan dapat digunakan kembali untuk proyek lain, seperti formulir kontak di situs web dapat menjadi aplikasi, dan dapat digunakan kembali untuk orang lain. Lihat itu sebagai modul proyek Anda.

Buat Aplikasi

Kami menganggap Anda berada di folder proyek Anda. Di folder “myproject” utama kami, folder yang sama kemudian manage.py -

$ python manage.py startapp myapp

Anda baru saja membuat aplikasi myapp dan menyukai proyek, Django membuat folder "myapp" dengan struktur aplikasi -

myapp/
   __init__.py
   admin.py
   models.py
   tests.py
   views.py
  • __init__.py - Hanya untuk memastikan python menangani folder ini sebagai sebuah paket.

  • admin.py - File ini membantu Anda membuat aplikasi dapat dimodifikasi di antarmuka admin.

  • models.py - Di sinilah semua model aplikasi disimpan.

  • tests.py - Di sinilah tes unit Anda.

  • views.py - Di sinilah tampilan aplikasi Anda.

Dapatkan Proyek untuk Mengetahui Tentang Aplikasi Anda

Pada tahap ini kita memiliki aplikasi "myapp" kita, sekarang kita perlu mendaftarkannya dengan proyek Django "myproject" kita. Untuk melakukannya, perbarui INSTALLED_APPS tuple di file settings.py proyek Anda (tambahkan nama aplikasi Anda) -

INSTALLED_APPS = (
   'django.contrib.admin',
   'django.contrib.auth',
   'django.contrib.contenttypes',
   'django.contrib.sessions',
   'django.contrib.messages',
   'django.contrib.staticfiles',
   'myapp',
)

Django menyediakan antarmuka pengguna yang siap digunakan untuk aktivitas administratif. Kita semua tahu betapa pentingnya antarmuka admin untuk proyek web. Django secara otomatis membuat UI admin berdasarkan model proyek Anda.

Memulai Antarmuka Admin

Antarmuka Admin bergantung pada modul django.countrib. Agar berfungsi, Anda perlu memastikan beberapa modul diimpor dalam tupel INSTALLED_APPS dan MIDDLEWARE_CLASSES dari file myproject / settings.py.

Untuk INSTALLED_APPS pastikan Anda memiliki -

INSTALLED_APPS = (
   'django.contrib.admin',
   'django.contrib.auth',
   'django.contrib.contenttypes',
   'django.contrib.sessions',
   'django.contrib.messages',
   'django.contrib.staticfiles',
   'myapp',
)

Untuk MIDDLEWARE_CLASSES -

MIDDLEWARE_CLASSES = (
   'django.contrib.sessions.middleware.SessionMiddleware',
   'django.middleware.common.CommonMiddleware',
   'django.middleware.csrf.CsrfViewMiddleware',
   'django.contrib.auth.middleware.AuthenticationMiddleware',
   'django.contrib.messages.middleware.MessageMiddleware',
   'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

Sebelum meluncurkan server Anda, untuk mengakses Antarmuka Admin, Anda perlu memulai database -

$ python manage.py migrate

syncdb akan membuat tabel atau koleksi yang diperlukan tergantung pada jenis db Anda, yang diperlukan untuk menjalankan antarmuka admin. Meskipun Anda tidak memiliki superuser, Anda akan diminta untuk membuatnya.

Jika Anda sudah memiliki pengguna super atau lupa, Anda selalu dapat membuatnya menggunakan kode berikut -

$ python manage.py createsuperuser

Sekarang untuk memulai Antarmuka Admin, kita perlu memastikan bahwa kita telah mengonfigurasi URL untuk antarmuka admin kita. Buka myproject / url.py dan Anda akan memiliki sesuatu seperti -

from django.conf.urls import patterns, include, url

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
   # Examples:
   # url(r'^$', 'myproject.views.home', name = 'home'),
   # url(r'^blog/', include('blog.urls')),

   url(r'^admin/', include(admin.site.urls)),
)

Sekarang jalankan server.

$ python manage.py runserver

Dan antarmuka admin Anda dapat diakses di: http://127.0.0.1:8000/admin/

Setelah terhubung dengan akun superuser Anda, Anda akan melihat layar berikut -

Antarmuka itu akan membiarkan Anda mengatur grup dan pengguna Django, dan semua model terdaftar dalam aplikasi Anda. Antarmuka memberi Anda kemampuan untuk melakukan setidaknya operasi "CRUD" (Buat, Baca, Perbarui, Hapus) pada model Anda.

Fungsi view, atau singkatnya "view", adalah fungsi Python yang menerima permintaan web dan mengembalikan respon web. Respons ini dapat berupa konten HTML dari halaman Web, atau pengalihan, atau kesalahan 404, atau dokumen XML, atau gambar, dll. Contoh: Anda menggunakan tampilan untuk membuat halaman web, perhatikan bahwa Anda perlu mengaitkan tampilan ke URL untuk melihatnya sebagai halaman web.

Dalam Django, tampilan harus dibuat dalam berkas app views.py.

Tampilan Sederhana

Kami akan membuat tampilan sederhana di myapp untuk mengatakan "selamat datang di aplikasi saya!"

Lihat tampilan berikut -

from django.http import HttpResponse

def hello(request):
   text = """<h1>welcome to my app !</h1>"""
   return HttpResponse(text)

Dalam tampilan ini, kami menggunakan HttpResponse untuk merender HTML (karena Anda mungkin telah memperhatikan bahwa kami memiliki kode keras HTML dalam tampilan). Untuk melihat tampilan ini sebagai halaman, kita hanya perlu memetakannya ke URL (ini akan dibahas dalam bab mendatang).

Kami menggunakan HttpResponse untuk merender HTML dalam tampilan sebelumnya. Ini bukan cara terbaik untuk merender halaman. Django mendukung pola MVT sehingga untuk membuat tampilan preseden, Django - seperti MVT, kita akan membutuhkan -

Sebuah template: myapp / templates / hello.html

Dan sekarang tampilan kita akan terlihat seperti -

from django.shortcuts import render

def hello(request):
   return render(request, "myapp/template/hello.html", {})

Tampilan juga dapat menerima parameter -

from django.http import HttpResponse

def hello(request, number):
   text = "<h1>welcome to my app number %s!</h1>"% number
   return HttpResponse(text)

Saat ditautkan ke URL, halaman akan menampilkan nomor yang diteruskan sebagai parameter. Perhatikan bahwa parameter akan diteruskan melalui URL (dibahas di bab selanjutnya).

Sekarang kita memiliki tampilan kerja seperti yang dijelaskan di bab sebelumnya. Kami ingin mengakses tampilan itu melalui URL. Django mempunyai caranya sendiri untuk pemetaan URL dan itu dilakukan dengan mengedit file url.py proyek Anda(myproject/url.py). File url.py terlihat seperti -

from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
   #Examples
   #url(r'^$', 'myproject.view.home', name = 'home'),
   #url(r'^blog/', include('blog.urls')),

   url(r'^admin', include(admin.site.urls)),
)

Ketika seorang pengguna membuat permintaan untuk sebuah halaman pada aplikasi web Anda, pengontrol Django mengambil alih untuk mencari tampilan terkait melalui berkas url.py, dan kemudian mengembalikan respon HTML atau kesalahan 404 tidak ditemukan, jika tidak ditemukan. Di url.py, hal terpenting adalah"urlpatterns"tupel. Di sinilah Anda menentukan pemetaan antara URL dan tampilan. Pemetaan adalah tupel dalam pola URL seperti -

from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
   #Examples
   #url(r'^$', 'myproject.view.home', name = 'home'),
   #url(r'^blog/', include('blog.urls')),

   url(r'^admin', include(admin.site.urls)),
   url(r'^hello/', 'myapp.views.hello', name = 'hello'),
)

Garis yang ditandai memetakan URL "/ home" ke tampilan hello yang dibuat di file myapp / view.py. Seperti yang Anda lihat di atas, pemetaan terdiri dari tiga elemen -

  • The pattern- Ekspresi reguler yang cocok dengan URL yang ingin Anda selesaikan dan petakan. Segala sesuatu yang dapat bekerja dengan modul python 're' memenuhi syarat untuk pola (berguna ketika Anda ingin mengirimkan parameter melalui url).

  • The python path to the view - Sama seperti saat Anda mengimpor modul.

  • The name- Untuk melakukan pembalikan URL, Anda harus menggunakan pola URL bernama seperti yang dilakukan pada contoh di atas. Setelah selesai, cukup mulai server untuk mengakses tampilan Anda melalui: http: //127.0.0.1/hello

Mengatur URL Anda

Sejauh ini, kami telah membuat URL dalam file “myprojects / url.py”, namun seperti yang dinyatakan sebelumnya tentang Django dan membuat aplikasi, poin terbaik adalah dapat menggunakan kembali aplikasi dalam proyek yang berbeda. Anda dapat dengan mudah melihat apa masalahnya, jika Anda menyimpan semua URL Anda di file “projecturl.py”. Jadi praktik terbaik adalah membuat "url.py" per aplikasi dan memasukkannya ke dalam proyek utama file url.py (kita sudah memasukkan URL admin untuk antarmuka admin sebelumnya).

Bagaimana cara melakukannya?

Kita perlu membuat file url.py di myapp menggunakan kode berikut -

from django.conf.urls import patterns, include, url

urlpatterns = patterns('', url(r'^hello/', 'myapp.views.hello', name = 'hello'),)

Kemudian myproject / url.py akan berubah menjadi berikut -

from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
   #Examples
   #url(r'^$', 'myproject.view.home', name = 'home'),
   #url(r'^blog/', include('blog.urls')),

   url(r'^admin', include(admin.site.urls)),
   url(r'^myapp/', include('myapp.urls')),
)

Kami telah memasukkan semua URL dari aplikasi myapp. Home.html yang diakses melalui “/ hello” sekarang menjadi “/ myapp / hello” yang merupakan struktur yang lebih baik dan lebih mudah dipahami untuk aplikasi web.

Sekarang mari kita bayangkan kita memiliki tampilan lain di myapp "pagi" dan kita ingin memetakannya di myapp / url.py, kita kemudian akan mengubah myapp / url.py kita menjadi -

from django.conf.urls import patterns, include, url

urlpatterns = patterns('',
   url(r'^hello/', 'myapp.views.hello', name = 'hello'),
   url(r'^morning/', 'myapp.views.morning', name = 'morning'),
)

Ini dapat difaktorkan ulang menjadi -

from django.conf.urls import patterns, include, url

urlpatterns = patterns('myapp.views',
   url(r'^hello/', 'hello', name = 'hello'),
   url(r'^morning/', 'morning', name = 'morning'),)

Seperti yang Anda lihat, kami sekarang menggunakan elemen pertama kami urlpatternstupel. Ini dapat berguna ketika Anda ingin mengubah nama aplikasi Anda.

Mengirim Parameter ke Tampilan

Kita sekarang tahu bagaimana memetakan URL, bagaimana mengaturnya, sekarang mari kita lihat bagaimana mengirim parameter ke tampilan. Contoh klasik adalah contoh artikel (Anda ingin mengakses artikel melalui “/ articles / article_id”).

Meneruskan parameter dilakukan dengan menangkapnya dengan regexpdi pola URL. Jika kita memiliki tampilan seperti berikut ini di “myapp / view.py”

from django.shortcuts import render
from django.http import HttpResponse

def hello(request):
   return render(request, "hello.html", {})

def viewArticle(request, articleId):
   text = "Displaying article Number : %s"%articleId
   return HttpResponse(text)

Kami ingin memetakannya di myapp / url.py sehingga kami dapat mengaksesnya melalui “/ myapp / article / articleId”, kami membutuhkan yang berikut di “myapp / url.py” -

from django.conf.urls import patterns, include, url

urlpatterns = patterns('myapp.views',
   url(r'^hello/', 'hello', name = 'hello'),
   url(r'^morning/', 'morning', name = 'morning'),
   url(r'^article/(\d+)/', 'viewArticle', name = 'article'),)

Ketika Django akan melihat url: "/ myapp / article / 42" itu akan meneruskan parameter '42' ke tampilan viewArticle, dan di browser Anda, Anda akan mendapatkan hasil berikut -

Perhatikan bahwa urutan parameter penting di sini. Misalkan kita menginginkan daftar artikel dari satu bulan dalam setahun, mari tambahkan tampilan viewArticles. View.py kita menjadi -

from django.shortcuts import render
from django.http import HttpResponse

def hello(request):
   return render(request, "hello.html", {})

def viewArticle(request, articleId):
   text = "Displaying article Number : %s"%articleId
   return HttpResponse(text)

def viewArticles(request, month, year):
   text = "Displaying articles of : %s/%s"%(year, month)
   return HttpResponse(text)

Yang sesuai url.py file akan terlihat seperti -

from django.conf.urls import patterns, include, url

urlpatterns = patterns('myapp.views',
   url(r'^hello/', 'hello', name = 'hello'),
   url(r'^morning/', 'morning', name = 'morning'),
   url(r'^article/(\d+)/', 'viewArticle', name = 'article'),
   url(r'^articles/(\d{2})/(\d{4})', 'viewArticles', name = 'articles'),)

Sekarang ketika Anda pergi ke "/ myapp / artikel / 12/2006 /" Anda akan mendapatkan 'Menampilkan artikel dari: 2006/12' tetapi jika Anda membalikkan parameter Anda tidak akan mendapatkan hasil yang sama.

Untuk menghindarinya, dimungkinkan untuk menautkan parameter URL ke parameter tampilan. Untuk itu, kamiurl.py akan menjadi -

from django.conf.urls import patterns, include, url

urlpatterns = patterns('myapp.views',
   url(r'^hello/', 'hello', name = 'hello'),
   url(r'^morning/', 'morning', name = 'morning'),
   url(r'^article/(\d+)/', 'viewArticle', name = 'article'),
   url(r'^articles/(?P\d{2})/(?P\d{4})', 'viewArticles', name = 'articles'),)

Django memungkinkan untuk memisahkan python dan HTML, python masuk ke tampilan dan HTML masuk ke templat. Untuk menghubungkan keduanya, Django mengandalkan pada fungsi render dan bahasa Templat Django.

Fungsi Render

Fungsi ini membutuhkan tiga parameter -

  • Request - Permintaan awal.

  • The path to the template - Ini adalah jalur relatif terhadap opsi TEMPLATE_DIRS di proyek settings.py variabel.

  • Dictionary of parameters- Kamus yang berisi semua variabel yang dibutuhkan dalam template. Variabel ini bisa dibuat atau Anda bisa menggunakan lokal () untuk meneruskan semua variabel lokal yang dideklarasikan dalam tampilan.

Bahasa Template Django (DTL)

Mesin cetakan Django menawarkan bahasa mini untuk mendefinisikan lapisan yang menghadap pengguna dari aplikasi.

Menampilkan Variabel

Variabel terlihat seperti ini: {{variable}}. Template menggantikan variabel dengan variabel yang dikirim oleh tampilan di parameter ketiga dari fungsi render. Mari kita ubah hello.html kita untuk menampilkan tanggal hari ini -

hello.html

<html>
   
   <body>
      Hello World!!!<p>Today is {{today}}</p>
   </body>
   
</html>

Kemudian pandangan kita akan berubah menjadi -

def hello(request):
   today = datetime.datetime.now().date()
   return render(request, "hello.html", {"today" : today})

Sekarang kita akan mendapatkan output berikut setelah mengakses URL / myapp / hello -

Hello World!!!
Today is Sept. 11, 2015

Seperti yang mungkin Anda perhatikan, jika variabel bukan sebuah string, Django akan menggunakan metode __str__ untuk menampilkannya; dan dengan prinsip yang sama Anda dapat mengakses atribut objek seperti yang Anda lakukan dengan Python. Contoh: jika kita ingin menampilkan tanggal tahun, variabel saya adalah: {{today.year}}.

Filter

Mereka membantu Anda memodifikasi variabel pada waktu tampilan. Struktur filter terlihat seperti berikut: {{var | filter}}.

Some examples -

  • {{string|truncatewords:80}} - Filter ini akan memotong string, jadi Anda hanya akan melihat 80 kata pertama.

  • {{string|lower}} - Mengubah string menjadi huruf kecil.

  • {{string|escape|linebreaks}} - Meloloskan diri dari konten string, lalu mengubah jeda baris menjadi tag.

Anda juga dapat menyetel default untuk variabel.

Tag

Tag memungkinkan Anda melakukan operasi berikut: if condition, for loop, template inheritance, dan lainnya.

Beri tag jika

Sama seperti di Python, Anda dapat menggunakan if, else dan elif di template Anda -

<html>
   <body>
   
      Hello World!!!<p>Today is {{today}}</p>
      We are
      {% if today.day == 1 %}
      
      the first day of month.
      {% elif today.day == 30 %}
      
      the last day of month.
      {% else %}
      
      I don't know.
      {%endif%}
      
   </body>
</html>

Dalam template baru ini, bergantung pada tanggal hari, template akan memberikan nilai tertentu.

Tag untuk

Sama seperti 'if', kami memiliki tag 'for', yang berfungsi persis seperti di Python. Mari kita ubah tampilan halo kita untuk mengirimkan daftar ke template kita -

def hello(request):
   today = datetime.datetime.now().date()
   
   daysOfWeek = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
   return render(request, "hello.html", {"today" : today, "days_of_week" : daysOfWeek})

Template untuk menampilkan daftar itu menggunakan {{for}} -

<html>
   <body>
      
      Hello World!!!<p>Today is {{today}}</p>
      We are
      {% if today.day == 1 %}
      
      the first day of month.
      {% elif today.day == 30 %}
      
      the last day of month.
      {% else %}
      
      I don't know.
      {%endif%}
      
      <p>
         {% for day in days_of_week %}
         {{day}}
      </p>
		
      {% endfor %}
      
   </body>
</html>

Dan kita harus mendapatkan sesuatu seperti -

Hello World!!!
Today is Sept. 11, 2015
We are I don't know.
Mon
Tue
Wed
Thu
Fri
Sat
Sun

Blokir dan Perpanjang Tag

Sistem template tidak dapat diselesaikan tanpa pewarisan template. Artinya ketika Anda mendesain template Anda, Anda harus memiliki template utama dengan lubang yang akan diisi oleh template anak sesuai dengan kebutuhannya sendiri, seperti halaman mungkin memerlukan css khusus untuk tab yang dipilih.

Mari kita ubah template hello.html menjadi warisan dari main_template.html.

main_template.html

<html>
   <head>
      
      <title>
         {% block title %}Page Title{% endblock %}
      </title>
      
   </head>
	
   <body>
   
      {% block content %}
         Body content
      {% endblock %}
      
   </body>
</html>

hello.html

{% extends "main_template.html" %}
{% block title %}My Hello Page{% endblock %}
{% block content %}

Hello World!!!<p>Today is {{today}}</p>
We are
{% if today.day == 1 %}

the first day of month.
{% elif today.day == 30 %}

the last day of month.
{% else %}

I don't know.
{%endif%}

<p>
   {% for day in days_of_week %}
   {{day}}
</p>

{% endfor %}
{% endblock %}

Dalam contoh di atas, saat memanggil / myapp / hello kita masih akan mendapatkan hasil yang sama seperti sebelumnya tetapi sekarang kita mengandalkan extends dan block untuk merefaktor kode kita -

Di main_template.html kita mendefinisikan blok menggunakan blok tag. Blok judul akan berisi judul halaman dan blok konten akan memiliki konten utama halaman. Di home.html kita menggunakan extends untuk mewarisi dari main_template.html lalu kita isi blok define di atas (konten dan judul).

Tag Komentar

Tag komentar membantu untuk mendefinisikan komentar ke dalam template, bukan komentar HTML, mereka tidak akan muncul di halaman HTML. Ini dapat berguna untuk dokumentasi atau hanya mengomentari sebaris kode.

Model adalah kelas yang mewakili tabel atau koleksi di DB kita, dan di mana setiap atribut kelas adalah bidang tabel atau koleksi. Model didefinisikan di app / models.py (dalam contoh kita: myapp / models.py)

Membuat Model

Berikut adalah model Dreamreal yang dibuat sebagai contoh -

from django.db import models

class Dreamreal(models.Model):

   website = models.CharField(max_length = 50)
   mail = models.CharField(max_length = 50)
   name = models.CharField(max_length = 50)
   phonenumber = models.IntegerField()

   class Meta:
      db_table = "dreamreal"

Setiap model mewarisi dari django.db.models.Model.

Kelas kita memiliki 4 atribut (3 CharField dan 1 Integer), itu akan menjadi bidang tabel.

Kelas Meta dengan atribut db_table memungkinkan kita menentukan tabel atau nama koleksi yang sebenarnya. Django menamai tabel atau kumpulan secara otomatis: myapp_modelName. Kelas ini akan membiarkan Anda memaksa nama tabel sesuai keinginan Anda.

Ada lebih banyak tipe bidang di django.db.models, Anda dapat mempelajarinya lebih lanjut di https://docs.djangoproject.com/en/1.5/ref/models/fields/#field-types

Setelah membuat model Anda, Anda akan membutuhkan Django untuk membuat basis data aktual -

$python manage.py syncdb

Memanipulasi Data (CRUD)

Mari buat tampilan "crudop" untuk melihat bagaimana kita dapat melakukan operasi CRUD pada model. Myapp / views.py kita akan terlihat seperti -

myapp/views.py

from myapp.models import Dreamreal
from django.http import HttpResponse

def crudops(request):
   #Creating an entry
   
   dreamreal = Dreamreal(
      website = "www.polo.com", mail = "[email protected]", 
      name = "sorex", phonenumber = "002376970"
   )
   
   dreamreal.save()
   
   #Read ALL entries
   objects = Dreamreal.objects.all()
   res ='Printing all Dreamreal entries in the DB : <br>'
   
   for elt in objects:
      res += elt.name+"<br>"
   
   #Read a specific entry:
   sorex = Dreamreal.objects.get(name = "sorex")
   res += 'Printing One entry <br>'
   res += sorex.name
   
   #Delete an entry
   res += '<br> Deleting an entry <br>'
   sorex.delete()
   
   #Update
   dreamreal = Dreamreal(
      website = "www.polo.com", mail = "[email protected]", 
      name = "sorex", phonenumber = "002376970"
   )
   
   dreamreal.save()
   res += 'Updating entry<br>'
   
   dreamreal = Dreamreal.objects.get(name = 'sorex')
   dreamreal.name = 'thierry'
   dreamreal.save()
   
   return HttpResponse(res)

Manipulasi Data Lainnya

Mari jelajahi manipulasi lain yang dapat kita lakukan pada Model. Perhatikan bahwa operasi CRUD dilakukan pada contoh model kami, sekarang kami akan bekerja secara langsung dengan kelas yang mewakili model kami.

Mari buat tampilan 'manipulasi data' di myapp/views.py

from myapp.models import Dreamreal
from django.http import HttpResponse

def datamanipulation(request):
   res = ''
   
   #Filtering data:
   qs = Dreamreal.objects.filter(name = "paul")
   res += "Found : %s results<br>"%len(qs)
   
   #Ordering results
   qs = Dreamreal.objects.order_by("name")
   
   for elt in qs:
      res += elt.name + '<br>'
   
   return HttpResponse(res)

Menghubungkan Model

Django ORM menawarkan 3 cara untuk menghubungkan model -

Salah satu kasus pertama yang akan kita lihat di sini adalah hubungan satu-ke-banyak. Seperti yang Anda lihat pada contoh di atas, perusahaan Dreamreal dapat memiliki banyak situs online. Mendefinisikan relasi tersebut dilakukan dengan menggunakan django.db.models.ForeignKey -

myapp/models.py

from django.db import models

class Dreamreal(models.Model):
   website = models.CharField(max_length = 50)
   mail = models.CharField(max_length = 50)
   name = models.CharField(max_length = 50)
   phonenumber = models.IntegerField()
   online = models.ForeignKey('Online', default = 1)
   
   class Meta:
      db_table = "dreamreal"

class Online(models.Model):
      domain = models.CharField(max_length = 30)
   
   class Meta:
      db_table = "online"

Seperti yang Anda lihat di myapp / models.py kami yang telah diperbarui, kami menambahkan model online dan menautkannya ke model Dreamreal kami.

Mari kita periksa bagaimana semua ini bekerja melalui manage.py shell -

Pertama mari buat beberapa perusahaan (entri Dreamreal) untuk pengujian di shell Django kita -

$python manage.py shell

>>> from myapp.models import Dreamreal, Online
>>> dr1 = Dreamreal()
>>> dr1.website = 'company1.com'
>>> dr1.name = 'company1'
>>> dr1.mail = 'contact@company1'
>>> dr1.phonenumber = '12345'
>>> dr1.save()
>>> dr2 = Dreamreal()
>>> dr1.website = 'company2.com'
>>> dr2.website = 'company2.com'
>>> dr2.name = 'company2'
>>> dr2.mail = 'contact@company2'
>>> dr2.phonenumber = '56789'
>>> dr2.save()

Sekarang beberapa domain yang dihosting -

>>> on1 = Online()
>>> on1.company = dr1
>>> on1.domain = "site1.com"
>>> on2 = Online()
>>> on2.company = dr1
>>> on2.domain = "site2.com"
>>> on3 = Online()
>>> on3.domain = "site3.com"
>>> dr2 = Dreamreal.objects.all()[2]
>>> on3.company = dr2
>>> on1.save()
>>> on2.save()
>>> on3.save()

Mengakses atribut perusahaan hosting (entri Dreamreal) dari domain online itu sederhana -

>>> on1.company.name

Dan jika kita ingin mengetahui semua domain online yang dihosting oleh Perusahaan di Dreamreal kita akan menggunakan kode -

>>> dr1.online_set.all()

Untuk mendapatkan QuerySet, perhatikan bahwa semua metode manipulasi telah kita lihat sebelumnya (filter, all, exclude, order_by ....)

Anda juga dapat mengakses atribut model tertaut untuk operasi pemfilteran, katakanlah Anda ingin mendapatkan semua domain online di mana nama Dreamreal berisi 'perusahaan' -

>>> Online.objects.filter(company__name__contains = 'company'

Note- Kueri semacam itu hanya didukung untuk SQL DB. Ini tidak akan berfungsi untuk DB non-relasional di mana tidak ada gabungan dan ada dua '_'.

Tapi itu bukan satu-satunya cara untuk menautkan model, Anda juga memiliki OneToOneField, tautan yang menjamin bahwa hubungan antara dua objek itu unik. Jika kami menggunakan OneToOneField dalam contoh kami di atas, itu berarti untuk setiap entri Dreamreal hanya satu entri Online yang memungkinkan dan dengan cara lain ke.

Dan yang terakhir, hubungan ManyToManyField for (nn) antar tabel. Catatan, itu relevan untuk DB berbasis SQL.

Pengalihan halaman diperlukan karena berbagai alasan dalam aplikasi web. Anda mungkin ingin mengarahkan pengguna ke halaman lain saat tindakan tertentu terjadi, atau pada dasarnya jika terjadi error. Misalnya, saat pengguna masuk ke situs web Anda, dia sering dialihkan ke halaman beranda utama atau ke dasbor pribadinya. Dalam Django, pengalihan diselesaikan menggunakan metode 'pengalihan'.

Metode 'redirect' mengambil sebagai argumen: URL yang ingin Anda alihkan sebagai nama tampilan string A.

Sejauh ini myapp / views terlihat seperti ini -

def hello(request):
   today = datetime.datetime.now().date()
   daysOfWeek = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
   return render(request, "hello.html", {"today" : today, "days_of_week" : daysOfWeek})
	
def viewArticle(request, articleId):
   """ A view that display an article based on his ID"""
   text = "Displaying article Number : %s" %articleId
   return HttpResponse(text)
	
def viewArticles(request, year, month):
   text = "Displaying articles of : %s/%s"%(year, month)
   return HttpResponse(text)

Mari kita ubah tampilan hello untuk mengalihkan ke djangoproject.com dan viewArticle kita untuk mengalihkan ke '/ myapp / artikel' internal kita. Untuk melakukannya, myapp / view.py akan berubah menjadi -

from django.shortcuts import render, redirect
from django.http import HttpResponse
import datetime

# Create your views here.
def hello(request):
   today = datetime.datetime.now().date()
   daysOfWeek = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
   return redirect("https://www.djangoproject.com")
	
def viewArticle(request, articleId):
   """ A view that display an article based on his ID"""
   text = "Displaying article Number : %s" %articleId
   return redirect(viewArticles, year = "2045", month = "02")
	
def viewArticles(request, year, month):
   text = "Displaying articles of : %s/%s"%(year, month)
   return HttpResponse(text)

Dalam contoh di atas, pertama kita mengimpor redirect dari django.shortcuts dan untuk pengalihan ke situs resmi Django kita hanya meneruskan URL lengkap ke metode 'redirect' sebagai string, dan untuk contoh kedua (tampilan viewArticle) 'redirect' metode mengambil nama tampilan dan parameternya sebagai argumen.

Mengakses / myapp / hello, akan memberi Anda layar berikut -

Dan mengakses / myapp / article / 42, akan memberi Anda layar berikut -

Dimungkinkan juga untuk menentukan apakah 'redirect' bersifat sementara atau permanen dengan menambahkan parameter permanen = True. Pengguna tidak akan melihat perbedaan, tetapi ini adalah detail yang diperhitungkan mesin pencari saat menentukan peringkat situs web Anda.

Ingat juga bahwa parameter 'name' yang kami tentukan di url.py kami saat memetakan URL -

url(r'^articles/(?P\d{2})/(?P\d{4})/', 'viewArticles', name = 'articles'),

Nama itu (di sini artikel) dapat digunakan sebagai argumen untuk metode 'redirect', maka pengalihan viewArticle kami dapat diubah dari -

def viewArticle(request, articleId):
   """ A view that display an article based on his ID"""
   text = "Displaying article Number : %s" %articleId
   return redirect(viewArticles, year = "2045", month = "02")

To -

def viewArticle(request, articleId):
   """ A view that display an article based on his ID"""
   text = "Displaying article Number : %s" %articleId
   return redirect(articles, year = "2045", month = "02")

Note- Ada juga fungsi untuk menghasilkan URL; ini digunakan dengan cara yang sama seperti pengalihan; metode 'terbalik' (django.core.urlresolvers.reverse). Fungsi ini tidak mengembalikan objek HttpResponseRedirect, tetapi hanya sebuah string yang berisi URL ke tampilan yang dikompilasi dengan argumen yang diteruskan.

Django hadir dengan mesin ringan yang siap dan mudah digunakan untuk mengirim e-mail. Mirip dengan Python, Anda hanya perlu mengimpor smtplib. Di Django anda hanya perlu mengimpor django.core.mail. Untuk mulai mengirim email, edit file settings.py proyek Anda dan setel opsi berikut -

  • EMAIL_HOST - server smtp.

  • EMAIL_HOST_USER - Kredensial login untuk server smtp.

  • EMAIL_HOST_PASSWORD - Kredensial kata sandi untuk server smtp.

  • EMAIL_PORT - port server smtp.

  • EMAIL_USE_TLS or _SSL - Benar jika koneksi aman.

Mengirim E-mail Sederhana

Mari buat tampilan "sendSimpleEmail" untuk mengirim email sederhana.

from django.core.mail import send_mail
from django.http import HttpResponse

def sendSimpleEmail(request,emailto):
   res = send_mail("hello paul", "comment tu vas?", "[email protected]", [emailto])
   return HttpResponse('%s'%res)

Berikut detail parameter send_mail -

  • subject - Subjek email.

  • message - Badan email.

  • from_email - Email dari.

  • recipient_list - Daftar alamat email penerima.

  • fail_silently - Bool, jika false send_mail akan memunculkan pengecualian jika terjadi kesalahan.

  • auth_user - Login pengguna jika tidak disetel di settings.py.

  • auth_password - Kata sandi pengguna jika tidak disetel di settings.py.

  • connection - Bagian belakang email.

  • html_message - (baru di Django 1.7) jika ada, email akan menjadi multi bagian / alternatif.

Mari buat URL untuk mengakses tampilan kita -

from django.conf.urls import patterns, url

urlpatterns = paterns('myapp.views', url(r'^simpleemail/(?P<emailto>
   [\w.%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4})/', 
   'sendSimpleEmail' , name = 'sendSimpleEmail'),)

Jadi saat mengakses /myapp/simpleemail/[email protected], Anda akan mendapatkan halaman berikut -

Mengirim Banyak Email dengan send_mass_mail

Metode ini mengembalikan jumlah pesan yang berhasil dikirim. Ini sama dengan send_mail tetapi membutuhkan parameter tambahan; datatuple, tampilan sendMassEmail kami akan menjadi -

from django.core.mail import send_mass_mail
from django.http import HttpResponse

def sendMassEmail(request,emailto):
   msg1 = ('subject 1', 'message 1', '[email protected]', [emailto1])
   msg2 = ('subject 2', 'message 2', '[email protected]', [emailto2])
   res = send_mass_mail((msg1, msg2), fail_silently = False)
   return HttpResponse('%s'%res)

Mari buat URL untuk mengakses tampilan kita -

from django.conf.urls import patterns, url

urlpatterns = paterns('myapp.views', url(r'^massEmail/(?P<emailto1>
   [\w.%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4})/(?P<emailto2>
   [\w.%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4})', 'sendMassEmail' , name = 'sendMassEmail'),)

Saat mengakses /myapp/massemail/[email protected]/[email protected]/, kami mendapatkan -

Rincian parameter send_mass_mail adalah -

  • datatuples - Tuple di mana setiap elemen seperti (subjek, pesan, from_email, penerima_list).

  • fail_silently - Bool, jika false send_mail akan memunculkan pengecualian jika terjadi kesalahan.

  • auth_user - Login pengguna jika tidak disetel di settings.py.

  • auth_password - Kata sandi pengguna jika tidak disetel di settings.py.

  • connection - Bagian belakang email.

Seperti yang Anda lihat pada gambar di atas, dua pesan berhasil dikirim.

Note - Dalam contoh ini kami menggunakan server debuggingserver smtp Python, yang dapat Anda luncurkan menggunakan -

$python -m smtpd -n -c DebuggingServer localhost:1025

Ini berarti semua email yang Anda kirim akan dicetak di stdout, dan server tiruan berjalan di localhost: 1025.

Sending e-mails to admins and managers using mail_admins and mail_managers methods

Metode ini mengirim email ke administrator situs seperti yang ditentukan dalam opsi ADMINS dari file settings.py, dan ke manajer situs seperti yang ditentukan dalam opsi MANAGERS dari file settings.py. Mari kita asumsikan opsi ADMINS dan MANAGERS kita terlihat seperti -

ADMINS = (('polo', '[email protected]'),)

MANAGERS = (('popoli', '[email protected]'),)

from django.core.mail import mail_admins
from django.http import HttpResponse

def sendAdminsEmail(request):
   res = mail_admins('my subject', 'site is going down.')
   return HttpResponse('%s'%res)

Kode di atas akan mengirimkan email ke setiap admin yang ditentukan di bagian ADMINS.

from django.core.mail import mail_managers
from django.http import HttpResponse

def sendManagersEmail(request):
   res = mail_managers('my subject 2', 'Change date on the site.')
   return HttpResponse('%s'%res)

Kode di atas akan mengirimkan email ke setiap manajer yang ditentukan di bagian MANAJER.

Detail parameter -

  • Subject - Subjek email.

  • message - Badan email.

  • fail_silently - Bool, jika false send_mail akan memunculkan pengecualian jika terjadi kesalahan.

  • connection - Bagian belakang email.

  • html_message - (baru di Django 1.7) jika ada, email akan menjadi multi bagian / alternatif.

Mengirim email HTML

Mengirim pesan HTML di Django> = 1.7 semudah -

from django.core.mail import send_mail

from django.http import HttpResponse
   res = send_mail("hello paul", "comment tu vas?", "[email protected]", 
         ["[email protected]"], html_message=")

Ini akan menghasilkan email multipart / alternatif.

Tetapi untuk Django <1.7 mengirim pesan HTML dilakukan melalui kelas django.core.mail.EmailMessage kemudian memanggil 'send' pada obyek -

Mari buat tampilan "sendHTMLEmail" untuk mengirim email HTML.

from django.core.mail import EmailMessage
from django.http import HttpResponse

def sendHTMLEmail(request , emailto):
   html_content = "<strong>Comment tu vas?</strong>"
   email = EmailMessage("my subject", html_content, "[email protected]", [emailto])
   email.content_subtype = "html"
   res = email.send()
   return HttpResponse('%s'%res)

Detail parameter untuk pembuatan kelas EmailMessage -

  • Subject - Subjek email.

  • message - Badan email dalam HTML.

  • from_email - Email dari.

  • to - Daftar alamat email penerima.

  • bcc - Daftar alamat email penerima “Bcc”.

  • connection - Bagian belakang email.

Mari buat URL untuk mengakses tampilan kita -

from django.conf.urls import patterns, url

urlpatterns = paterns('myapp.views', url(r'^htmlemail/(?P<emailto>
   [\w.%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4})/', 
   'sendHTMLEmail' , name = 'sendHTMLEmail'),)

Saat mengakses /myapp/htmlemail/[email protected], kami mendapatkan -

Mengirim E-mail dengan Lampiran

Ini dilakukan dengan menggunakan metode 'lampirkan' pada objek EmailMessage.

Tampilan untuk mengirim email dengan lampiran akan -

from django.core.mail import EmailMessage
from django.http import HttpResponse

def sendEmailWithAttach(request, emailto):
   html_content = "Comment tu vas?"
   email = EmailMessage("my subject", html_content, "[email protected]", emailto])
   email.content_subtype = "html"
   
   fd = open('manage.py', 'r')
   email.attach('manage.py', fd.read(), 'text/plain')
   
   res = email.send()
   return HttpResponse('%s'%res)

Detail tentang melampirkan argumen -

  • filename - Nama file yang akan dilampirkan.

  • content - Isi file yang akan dilampirkan.

  • mimetype - Jenis pantomim konten lampiran.

Dalam beberapa kasus, menulis pandangan, seperti yang telah kita lihat sebelumnya sangatlah berat. Bayangkan Anda membutuhkan halaman statis atau halaman daftar. Django menawarkan cara mudah untuk menyetel tampilan sederhana itu yang disebut tampilan umum.

Tidak seperti tampilan klasik, tampilan umum adalah kelas, bukan fungsi. Django menawarkan sekumpulan kelas untuk tampilan umum di django.views.generic, dan setiap tampilan umum adalah salah satu kelas itu atau kelas yang mewarisi dari salah satunya.

Ada 10+ kelas generik -

>>> import django.views.generic
>>> dir(django.views.generic)

['ArchiveIndexView', 'CreateView', 'DateDetailView', 'DayArchiveView', 
   'DeleteView', 'DetailView', 'FormView', 'GenericViewError', 'ListView', 
   'MonthArchiveView', 'RedirectView', 'TemplateView', 'TodayArchiveView', 
   'UpdateView', 'View', 'WeekArchiveView', 'YearArchiveView', '__builtins__', 
   '__doc__', '__file__', '__name__', '__package__', '__path__', 'base', 'dates', 
   'detail', 'edit', 'list']

Ini dapat Anda gunakan untuk tampilan umum Anda. Mari kita lihat beberapa contoh untuk melihat cara kerjanya.

Halaman Statis

Mari publikasikan halaman statis dari template "static.html".

Static.html kami -

<html>
   <body> 
      This is a static page!!! 
   </body>
</html>

Jika kami melakukan itu dengan cara yang kami pelajari sebelumnya, kami harus mengubah myapp/views.py menjadi -

from django.shortcuts import render

def static(request):
   return render(request, 'static.html', {})

dan myapp/urls.py menjadi -

from django.conf.urls import patterns, url

urlpatterns = patterns("myapp.views", url(r'^static/', 'static', name = 'static'),)

Cara terbaik adalah menggunakan tampilan umum. Untuk itu, myapp / views.py kita akan menjadi -

from django.views.generic import TemplateView

class StaticView(TemplateView):
   template_name = "static.html"

Dan myapp / urls.py kami, kami akan -

from myapp.views import StaticView
from django.conf.urls import patterns

urlpatterns = patterns("myapp.views", (r'^static/$', StaticView.as_view()),)

Saat mengakses / myapp / static Anda mendapatkan -

Untuk hasil yang sama kita juga bisa, lakukan hal berikut -

  • Tidak ada perubahan di views.py
  • Ubah file url.py menjadi -
from django.views.generic import TemplateView
from django.conf.urls import patterns, url

urlpatterns = patterns("myapp.views",
   url(r'^static/',TemplateView.as_view(template_name = 'static.html')),)

Seperti yang Anda lihat, Anda hanya perlu mengubah file url.py di metode kedua.

Daftar dan Tampilkan Data dari DB

Kami akan membuat daftar semua entri dalam model Dreamreal kami. Melakukannya menjadi mudah dengan menggunakan kelas tampilan generik ListView. Edit file url.py dan perbarui sebagai -

from django.views.generic import ListView
from django.conf.urls import patterns, url

urlpatterns = patterns(
   "myapp.views", url(r'^dreamreals/', ListView.as_view(model = Dreamreal, 
      template_name = "dreamreal_list.html")),
)

Penting untuk diperhatikan saat ini adalah variabel yang melewati tampilan umum ke template adalah object_list. Jika Anda ingin menamainya sendiri, Anda perlu menambahkan argumen context_object_name ke metode as_view. Kemudian url.py akan menjadi -

from django.views.generic import ListView
from django.conf.urls import patterns, url

urlpatterns = patterns("myapp.views",
   url(r'^dreamreals/', ListView.as_view(
      template_name = "dreamreal_list.html")),
      model = Dreamreal, context_object_name = ”dreamreals_objects” ,)

Template terkait kemudian akan -

{% extends "main_template.html" %}
{% block content %}
Dreamreals:<p>
{% for dr in object_list %}
{{dr.name}}</p>
{% endfor %}
{% endblock %}

Mengakses / myapp / dreamreals / akan menghasilkan halaman berikut -

Membuat formulir di Django, sangat mirip dengan membuat model. Di sini sekali lagi, kita hanya perlu mewarisi dari kelas Django dan atribut kelas akan menjadi bidang formulir. Mari tambahkanforms.pyfile di folder myapp untuk menampung formulir aplikasi kami. Kami akan membuat formulir login.

myapp/forms.py

#-*- coding: utf-8 -*-
from django import forms

class LoginForm(forms.Form):
   user = forms.CharField(max_length = 100)
   password = forms.CharField(widget = forms.PasswordInput())

Seperti yang terlihat di atas, jenis bidang dapat menggunakan argumen "widget" untuk rendering html; dalam kasus kami, kami ingin kata sandi disembunyikan, tidak ditampilkan. Banyak widget lainnya hadir di Django:DateInput untuk kencan, CheckboxInput untuk kotak centang, dll.

Menggunakan Formulir dalam Tampilan

Ada dua jenis permintaan HTTP, GET dan POST. Dalam Django, objek permintaan yang dikirimkan sebagai parameter ke tampilan Anda memiliki atribut yang disebut "metode" di mana tipe permintaan disetel, dan semua data yang dilewatkan melalui POST dapat diakses melalui kamus request.POST.

Mari buat tampilan login di myapp / views.py -

#-*- coding: utf-8 -*-
from myapp.forms import LoginForm

def login(request):
   username = "not logged in"
   
   if request.method == "POST":
      #Get the posted form
      MyLoginForm = LoginForm(request.POST)
      
      if MyLoginForm.is_valid():
         username = MyLoginForm.cleaned_data['username']
   else:
      MyLoginForm = Loginform()
		
   return render(request, 'loggedin.html', {"username" : username})

Tampilan akan menampilkan hasil dari form login yang diposting melalui loggedin.html. Untuk mengujinya, pertama-tama kita membutuhkan template formulir login. Sebut saja login.html.

<html>
   <body>
      
      <form name = "form" action = "{% url "myapp.views.login" %}" 
         method = "POST" >{% csrf_token %}
         
         <div style = "max-width:470px;">
            <center> 
               <input type = "text" style = "margin-left:20%;" 
                  placeholder = "Identifiant" name = "username" />
            </center>
         </div>
			
         <br>
         
         <div style = "max-width:470px;">
            <center>
               <input type = "password" style = "margin-left:20%;" 
                  placeholder = "password" name = "password" />
            </center>
         </div>
			
         <br>
         
         <div style = "max-width:470px;">
            <center> 
            
               <button style = "border:0px; background-color:#4285F4; margin-top:8%;
                  height:35px; width:80%;margin-left:19%;" type = "submit" 
                  value = "Login" >
                  <strong>Login</strong>
               </button>
               
            </center>
         </div>
         
      </form>
      
   </body>
</html>

Template akan menampilkan form login dan memposting hasilnya ke tampilan login kita di atas. Anda mungkin telah memperhatikan tag di template, yang hanya untuk mencegah serangan Cross-site Request Forgery (CSRF) di situs Anda.

{% csrf_token %}

Setelah kita memiliki template login, kita membutuhkan template logsin.html yang akan ditampilkan setelah perlakuan formulir.

<html>
   
   <body>
      You are : <strong>{{username}}</strong>
   </body>
   
</html>

Sekarang, kita hanya membutuhkan pasangan URL kita untuk memulai: myapp / urls.py

from django.conf.urls import patterns, url
from django.views.generic import TemplateView

urlpatterns = patterns('myapp.views',
   url(r'^connection/',TemplateView.as_view(template_name = 'login.html')),
   url(r'^login/', 'login', name = 'login'))

Saat mengakses "/ myapp / connection", kita akan mendapatkan template login.html berikut ini -

Di form post, form tersebut valid. Dalam kasus kami, pastikan untuk mengisi dua bidang dan Anda akan mendapatkan -

Jika nama pengguna Anda polo, dan Anda lupa kata sandinya. Anda akan mendapatkan pesan berikut -

Menggunakan Validasi Formulir Kami Sendiri

Dalam contoh di atas, saat memvalidasi formulir -

MyLoginForm.is_valid()

Kami hanya menggunakan mesin validasi bentuk-sendiri Django, dalam kasus kami hanya memastikan bidang diperlukan. Sekarang mari kita coba untuk memastikan pengguna yang mencoba login hadir di DB kita sebagai entri Dreamreal. Untuk ini, ubah myapp / forms.py menjadi -

#-*- coding: utf-8 -*-
from django import forms
from myapp.models import Dreamreal

class LoginForm(forms.Form):
   user = forms.CharField(max_length = 100)
   password = forms.CharField(widget = forms.PasswordInput())

   def clean_message(self):
      username = self.cleaned_data.get("username")
      dbuser = Dreamreal.objects.filter(name = username)
      
      if not dbuser:
         raise forms.ValidationError("User does not exist in our db!")
      return username

Sekarang, setelah memanggil metode "is_valid", kita akan mendapatkan keluaran yang benar, hanya jika pengguna ada dalam database kita. Jika Anda ingin memeriksa bidang formulir Anda, cukup tambahkan metode yang dimulai dengan "clean_" lalu nama bidang Anda ke kelas formulir Anda. Menaikkan formulir. ValidationError itu penting.

Secara umum berguna untuk aplikasi web untuk dapat mengunggah file (gambar profil, lagu, pdf, kata-kata .....). Mari kita bahas cara mengupload file di bab ini.

Mengupload Gambar

Sebelum mulai bermain dengan gambar, pastikan Anda telah menginstal Python Image Library (PIL). Sekarang untuk mengilustrasikan mengunggah gambar, mari buat formulir profil, di myapp / forms.py -

#-*- coding: utf-8 -*-
from django import forms

class ProfileForm(forms.Form):
   name = forms.CharField(max_length = 100)
   picture = forms.ImageFields()

Seperti yang Anda lihat, perbedaan utama di sini hanyalah forms.ImageField. ImageField akan memastikan file yang diunggah adalah gambar. Jika tidak, validasi formulir akan gagal.

Sekarang mari buat model "Profil" untuk menyimpan profil yang kita unggah. Ini dilakukan di myapp / models.py -

from django.db import models

class Profile(models.Model):
   name = models.CharField(max_length = 50)
   picture = models.ImageField(upload_to = 'pictures')

   class Meta:
      db_table = "profile"

Seperti yang Anda lihat untuk modelnya, ImageField mengambil argumen wajib: upload_to. Ini mewakili tempat di hard drive tempat gambar Anda akan disimpan. Perhatikan bahwa parameter akan ditambahkan ke opsi MEDIA_ROOT yang ditentukan di file settings.py Anda.

Sekarang setelah kita memiliki Formulir dan Model, mari buat tampilan, di myapp / views.py -

#-*- coding: utf-8 -*-
from myapp.forms import ProfileForm
from myapp.models import Profile

def SaveProfile(request):
   saved = False
   
   if request.method == "POST":
      #Get the posted form
      MyProfileForm = ProfileForm(request.POST, request.FILES)
      
      if MyProfileForm.is_valid():
         profile = Profile()
         profile.name = MyProfileForm.cleaned_data["name"]
         profile.picture = MyProfileForm.cleaned_data["picture"]
         profile.save()
         saved = True
   else:
      MyProfileForm = Profileform()
		
   return render(request, 'saved.html', locals())

Bagian yang tidak boleh dilewatkan adalah, ada perubahan saat membuat ProfileForm, kami menambahkan parameter kedua: request.FILES. Jika tidak lolos validasi formulir akan gagal, memberikan pesan bahwa gambar kosong.

Sekarang, kami hanya membutuhkan file saved.html template dan profile.html template, untuk formulir dan halaman pengalihan -

myapp/templates/saved.html -

<html>
   <body>
   
      {% if saved %}
         <strong>Your profile was saved.</strong>
      {% endif %}
      
      {% if not saved %}
         <strong>Your profile was not saved.</strong>
      {% endif %}
      
   </body>
</html>

myapp/templates/profile.html -

<html>
   <body>
   
      <form name = "form" enctype = "multipart/form-data" 
         action = "{% url "myapp.views.SaveProfile" %}" method = "POST" >{% csrf_token %}
         
         <div style = "max-width:470px;">
            <center>  
               <input type = "text" style = "margin-left:20%;" 
               placeholder = "Name" name = "name" />
            </center>
         </div>
			
         <br>
         
         <div style = "max-width:470px;">
            <center> 
               <input type = "file" style = "margin-left:20%;" 
                  placeholder = "Picture" name = "picture" />
            </center>
         </div>
			
         <br>
         
         <div style = "max-width:470px;">
            <center> 
            
               <button style = "border:0px;background-color:#4285F4; margin-top:8%; 
                  height:35px; width:80%; margin-left:19%;" type = "submit" value = "Login" >
                  <strong>Login</strong>
               </button>
               
            </center>
         </div>
         
      </form>
      
   </body>
</html>

Selanjutnya, kita membutuhkan pasangan URL kita untuk memulai: myapp / urls.py

from django.conf.urls import patterns, url
from django.views.generic import TemplateView

urlpatterns = patterns(
   'myapp.views', url(r'^profile/',TemplateView.as_view(
      template_name = 'profile.html')), url(r'^saved/', 'SaveProfile', name = 'saved')
)

Saat mengakses "/ myapp / profile", kita akan mendapatkan template profile.html berikut dirender -

Dan pada form post, template yang disimpan akan dirender -

Kami memiliki contoh untuk gambar, tetapi jika Anda ingin mengunggah jenis file lain, bukan hanya gambar, ganti saja ImageField di Model dan Formulir dengan FileField.

Sejauh ini, dalam contoh kami, kami telah menggunakan server web Django dev. Tetapi server ini hanya untuk pengujian dan tidak cocok untuk lingkungan produksi. Setelah di produksi, Anda memerlukan server nyata seperti Apache, Nginx, dll. Mari kita bahas Apache di bab ini.

Melayani aplikasi Django melalui Apache dilakukan dengan menggunakan mod_wsgi. Jadi, hal pertama adalah memastikan Anda menginstal Apache dan mod_wsgi. Ingat, ketika kami membuat proyek kami dan kami melihat struktur proyek, itu tampak seperti -

myproject/
   manage.py
   myproject/
      __init__.py
      settings.py
      urls.py
      wsgi.py

Berkas wsgi.py adalah yang mengurus hubungan antara Django dan Apache.

Katakanlah kita ingin membagikan proyek kita (myproject) dengan Apache. Kami hanya perlu mengatur Apache untuk mengakses folder kami. Asumsikan kita meletakkan folder myproject kita di default "/ var / www / html". Pada tahap ini, mengakses proyek akan dilakukan melalui 127.0.0.1/myproject. Ini akan menghasilkan Apache hanya mencantumkan folder seperti yang ditunjukkan pada snapshot berikut.

Seperti yang terlihat, Apache tidak menangani barang Django. Untuk mengatasi hal ini, kita perlu mengkonfigurasi Apache di httpd.conf. Jadi buka httpd.conf dan tambahkan baris berikut -

WSGIScriptAlias / /var/www/html/myproject/myproject/wsgi.py
WSGIPythonPath /var/www/html/myproject/

<Directory /var/www/html/myproject/>
   <Files wsgi.py>
      Order deny,allow
      Allow from all
   </Files>
</Directory>

Jika Anda dapat mengakses halaman login sebagai 127.0.0.1/myapp/connection, Anda akan melihat halaman berikut -

Terkadang Anda mungkin ingin menyimpan beberapa data per pengunjung situs sesuai dengan persyaratan aplikasi web Anda. Ingatlah selalu, bahwa cookie disimpan di sisi klien dan bergantung pada tingkat keamanan browser klien Anda, pengaturan cookie terkadang dapat berfungsi dan terkadang tidak.

Untuk mengilustrasikan penanganan kuki di Django, mari buat sistem menggunakan sistem masuk yang kita buat sebelumnya. Sistem akan membuat Anda tetap masuk selama X menit, dan setelah itu, Anda akan keluar dari aplikasi.

Untuk ini, Anda perlu menyiapkan dua cookie, last_connection dan nama pengguna.

Pertama, mari ubah tampilan login untuk menyimpan nama pengguna dan cookie last_connection -

from django.template import RequestContext

def login(request):
   username = "not logged in"
   
   if request.method == "POST":
      #Get the posted form
      MyLoginForm = LoginForm(request.POST)
   
   if MyLoginForm.is_valid():
      username = MyLoginForm.cleaned_data['username']
   else:
      MyLoginForm = LoginForm()
   
   response = render_to_response(request, 'loggedin.html', {"username" : username}, 
      context_instance = RequestContext(request))
   
   response.set_cookie('last_connection', datetime.datetime.now())
   response.set_cookie('username', datetime.datetime.now())
	
   return response

Seperti yang terlihat pada tampilan di atas, pengaturan cookie dilakukan oleh set_cookie metode memanggil respons bukan permintaan, dan juga perhatikan bahwa semua nilai cookie dikembalikan sebagai string.

Sekarang mari buat formView untuk formulir login, di mana kita tidak akan menampilkan formulir jika cookie disetel dan tidak lebih dari 10 detik -

def formView(request):
   if 'username' in request.COOKIES and 'last_connection' in request.COOKIES:
      username = request.COOKIES['username']
      
      last_connection = request.COOKIES['last_connection']
      last_connection_time = datetime.datetime.strptime(last_connection[:-7], 
         "%Y-%m-%d %H:%M:%S")
      
      if (datetime.datetime.now() - last_connection_time).seconds < 10:
         return render(request, 'loggedin.html', {"username" : username})
      else:
         return render(request, 'login.html', {})
			
   else:
      return render(request, 'login.html', {})

Seperti yang Anda lihat di formView di atas, mengakses cookie yang Anda setel, dilakukan melalui atribut COOKIES (dict) dari permintaan tersebut.

Sekarang mari kita ubah file url.py untuk mengubah URL sehingga berpasangan dengan tampilan baru kita -

from django.conf.urls import patterns, url
from django.views.generic import TemplateView

urlpatterns = patterns('myapp.views',
   url(r'^connection/','formView', name = 'loginform'),
   url(r'^login/', 'login', name = 'login'))

Saat mengakses / myapp / koneksi, Anda akan mendapatkan halaman berikut -

Dan Anda akan diarahkan ke layar berikut saat mengirimkan -

Sekarang, jika Anda mencoba mengakses / myapp / koneksi lagi dalam rentang 10 detik, Anda akan diarahkan ke layar kedua secara langsung. Dan jika Anda mengakses / myapp / koneksi lagi dari kisaran ini, Anda akan mendapatkan formulir login (layar 1).

Seperti yang telah dibahas sebelumnya, kita dapat menggunakan cookie sisi klien untuk menyimpan banyak data berguna untuk aplikasi web. Kami telah melihat sebelumnya bahwa kami dapat menggunakan cookie sisi klien untuk menyimpan berbagai data yang berguna untuk aplikasi web kami. Hal ini menyebabkan banyak lubang keamanan tergantung pada pentingnya data yang ingin Anda simpan.

Untuk alasan keamanan, Django mempunyai kerangka sesi untuk penanganan cookie. Sesi digunakan untuk mengabstraksi penerimaan dan pengiriman cookie, data disimpan di sisi server (seperti dalam database), dan cookie sisi klien hanya memiliki ID sesi untuk identifikasi. Sesi juga berguna untuk menghindari kasus di mana browser pengguna disetel ke 'tidak menerima' cookie.

Menyiapkan Sesi

Di Django, mengaktifkan sesi dilakukan dalam proyek Anda settings.py, dengan menambahkan beberapa baris ke MIDDLEWARE_CLASSES dan INSTALLED_APPSpilihan. Ini harus dilakukan saat membuat proyek, tetapi selalu baik untuk mengetahuinyaMIDDLEWARE_CLASSES seharusnya -

'django.contrib.sessions.middleware.SessionMiddleware'

Dan INSTALLED_APPS seharusnya -

'django.contrib.sessions'

Secara default, Django menyimpan informasi sesi dalam database (tabel atau kumpulan django_session), tetapi Anda dapat mengonfigurasi mesin untuk menyimpan informasi menggunakan cara lain seperti: di file atau dalam cache.

Ketika sesi diaktifkan, setiap permintaan (argumen pertama dari setiap tampilan di Django) mempunyai atribut sesi (dikt).

Mari buat contoh sederhana untuk melihat cara membuat dan menyimpan sesi. Kami telah membangun sistem login sederhana sebelumnya (lihat bab pemrosesan formulir Django dan bab Penanganan Cookie Django). Biarkan kami menyimpan nama pengguna dalam cookie sehingga, jika tidak keluar, saat mengakses halaman login kami, Anda tidak akan melihat formulir login. Pada dasarnya, mari kita buat sistem login yang kita gunakan dalam penanganan Cookie Django lebih aman, dengan menyimpan sisi server cookie.

Untuk ini, pertama-tama mari ubah tampilan login kami untuk menyimpan sisi server cookie nama pengguna kami -

def login(request):
   username = 'not logged in'
   
   if request.method == 'POST':
      MyLoginForm = LoginForm(request.POST)
      
      if MyLoginForm.is_valid():
         username = MyLoginForm.cleaned_data['username']
         request.session['username'] = username
      else:
         MyLoginForm = LoginForm()
			
   return render(request, 'loggedin.html', {"username" : username}

Kemudian mari kita buat tampilan formView untuk formulir login, di mana kita tidak akan menampilkan formulir jika cookie disetel -

def formView(request):
   if request.session.has_key('username'):
      username = request.session['username']
      return render(request, 'loggedin.html', {"username" : username})
   else:
      return render(request, 'login.html', {})

Sekarang mari kita ubah file url.py untuk mengubah url sehingga berpasangan dengan tampilan baru kita -

from django.conf.urls import patterns, url
from django.views.generic import TemplateView

urlpatterns = patterns('myapp.views',
   url(r'^connection/','formView', name = 'loginform'),
   url(r'^login/', 'login', name = 'login'))

Saat mengakses / myapp / koneksi, Anda akan melihat halaman berikut -

Dan Anda akan diarahkan ke halaman berikut -

Sekarang jika Anda mencoba mengakses / myapp / koneksi lagi, Anda akan diarahkan ke layar kedua secara langsung.

Mari buat tampilan logout sederhana yang menghapus cookie kita.

def logout(request):
   try:
      del request.session['username']
   except:
      pass
   return HttpResponse("<strong>You are logged out.</strong>")

Dan pasangkan dengan URL logout di myapp / url.py

url(r'^logout/', 'logout', name = 'logout'),

Sekarang, jika Anda mengakses / myapp / logout, Anda akan mendapatkan halaman berikut -

Jika Anda mengakses / myapp / koneksi lagi, Anda akan mendapatkan formulir login (layar 1).

Beberapa Kemungkinan Tindakan Menggunakan Sesi

Kami telah melihat cara menyimpan dan mengakses sesi, tetapi sebaiknya diketahui bahwa atribut sesi dari permintaan memiliki beberapa tindakan berguna lainnya seperti -

  • set_expiry (value) - Mengatur waktu kedaluwarsa untuk sesi tersebut.

  • get_expiry_age() - Mengembalikan jumlah detik hingga sesi ini berakhir.

  • get_expiry_date() - Mengembalikan tanggal sesi ini akan berakhir.

  • clear_expired() - Menghapus sesi kedaluwarsa dari penyimpanan sesi.

  • get_expire_at_browser_close() - Menampilkan True atau False, tergantung pada apakah cookie sesi pengguna telah kedaluwarsa saat browser web pengguna ditutup.

Men-cache sesuatu berarti menyimpan hasil kalkulasi yang mahal, sehingga Anda tidak melakukannya saat Anda membutuhkannya. Berikut ini adalah pseudo code yang menjelaskan cara kerja caching -

given a URL, try finding that page in the cache

if the page is in the cache:
   return the cached page
else:
   generate the page
   save the generated page in the cache (for next time)
   return the generated page

Django datang dengan sistem temboloknya sendiri yang memungkinkan Anda menyimpan halaman dinamis Anda, untuk menghindari menghitungnya lagi bila diperlukan. Hal yang baik dalam kerangka Cache Django adalah bahwa Anda dapat menyimpan -

  • Output dari tampilan tertentu.
  • Bagian dari template.
  • Seluruh situs Anda.

Untuk menggunakan tembolok di Django, hal pertama yang harus dilakukan adalah menyetel di mana tembolok akan tinggal. Kerangka cache menawarkan kemungkinan yang berbeda - cache dapat disimpan dalam database, pada sistem file atau langsung di memori. Pengaturan dilakukan disettings.py file proyek Anda.

Menyiapkan Cache di Database

Cukup tambahkan yang berikut ini di file project settings.py -

CACHES = {
   'default': {
      'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
      'LOCATION': 'my_table_name',
   }
}

Agar ini bekerja dan untuk menyelesaikan pengaturan, kita perlu membuat tabel cache 'my_table_name'. Untuk ini, Anda perlu melakukan hal berikut -

python manage.py createcachetable

Menyiapkan Cache di Sistem File

Cukup tambahkan yang berikut ini di file project settings.py -

CACHES = {
   'default': {
      'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
      'LOCATION': '/var/tmp/django_cache',
   }
}

Menyiapkan Cache dalam Memori

Ini adalah cara caching yang paling efisien, untuk menggunakannya Anda dapat menggunakan salah satu opsi berikut bergantung pada pustaka pengikat Python yang Anda pilih untuk cache memori -

CACHES = {
   'default': {
      'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
      'LOCATION': '127.0.0.1:11211',
   }
}

Or

CACHES = {
   'default': {
      'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
      'LOCATION': 'unix:/tmp/memcached.sock',
   }
}

Menyimpan Seluruh Situs

Cara termudah menggunakan tembolok di Django adalah men-cache seluruh situs. Ini dilakukan dengan mengedit opsi MIDDLEWARE_CLASSES di proyek settings.py. Berikut ini perlu ditambahkan ke opsi -

MIDDLEWARE_CLASSES += (
   'django.middleware.cache.UpdateCacheMiddleware',
   'django.middleware.common.CommonMiddleware',
   'django.middleware.cache.FetchFromCacheMiddleware',
)

Perhatikan bahwa urutan penting di sini, Pembaruan harus dilakukan sebelum Ambil middleware.

Kemudian di file yang sama, Anda perlu mengatur -

CACHE_MIDDLEWARE_ALIAS – The cache alias to use for storage.
CACHE_MIDDLEWARE_SECONDS – The number of seconds each page should be cached.

Menyimpan Tampilan dalam cache

Jika Anda tidak ingin meng-cache seluruh situs, Anda dapat meng-cache tampilan tertentu. Ini dilakukan dengan menggunakancache_pagedekorator yang datang dengan Django. Misalkan kita ingin menyimpan hasil dariviewArticles melihat -

from django.views.decorators.cache import cache_page

@cache_page(60 * 15)

def viewArticles(request, year, month):
   text = "Displaying articles of : %s/%s"%(year, month)
   return HttpResponse(text)

Seperti yang dapat Anda lihat cache_pagemembutuhkan jumlah detik Anda ingin hasil tampilan di-cache sebagai parameter. Dalam contoh kami di atas, hasilnya akan disimpan dalam cache selama 15 menit.

Note - Seperti yang telah kita lihat sebelumnya, tampilan di atas dipetakan ke -

urlpatterns = patterns('myapp.views',
   url(r'^articles/(?P<month>\d{2})/(?P<year>\d{4})/', 'viewArticles', name = 'articles'),)

Karena URL mengambil parameter, setiap panggilan yang berbeda akan di-cache secara terpisah. Misalnya, permintaan ke / myapp / artikel / 02/2007 akan disimpan dalam cache secara terpisah ke / myapp / artikel / 03/2008.

Meng-cache tampilan juga bisa langsung dilakukan di file url.py. Maka berikut ini memiliki hasil yang sama seperti di atas. Cukup edit file myapp / url.py Anda dan ubah URL yang dipetakan terkait (di atas) menjadi -

urlpatterns = patterns('myapp.views',
   url(r'^articles/(?P<month>\d{2})/(?P<year>\d{4})/', 
   cache_page(60 * 15)('viewArticles'), name = 'articles'),)

Dan, tentu saja, ini tidak lagi dibutuhkan di myapp / views.py.

Menyimpan Fragmen Template

Anda juga dapat membuat cache bagian template, ini dilakukan dengan menggunakan file cachemenandai. Mari kita ambilhello.html template -

{% extends "main_template.html" %}
{% block title %}My Hello Page{% endblock %}
{% block content %}

Hello World!!!<p>Today is {{today}}</p>
We are
{% if today.day == 1 %}

the first day of month.
{% elif today.day == 30 %}

the last day of month.
{% else %}

I don't know.
{%endif%}

<p>
   {% for day in days_of_week %}
   {{day}}
</p>

{% endfor %}
{% endblock %}

Dan untuk meng-cache blok konten, template kita akan menjadi -

{% load cache %}
{% extends "main_template.html" %}
{% block title %}My Hello Page{% endblock %}
{% cache 500 content %}
{% block content %}

Hello World!!!<p>Today is {{today}}</p>
We are
{% if today.day == 1 %}

the first day of month.
{% elif today.day == 30 %}

the last day of month.
{% else %}

I don't know.
{%endif%}

<p>
   {% for day in days_of_week %}
   {{day}}
</p>

{% endfor %}
{% endblock %}
{% endcache %}

Seperti yang Anda lihat di atas, tag cache akan mengambil 2 parameter - waktu Anda ingin blok di-cache (dalam detik) dan nama yang akan diberikan ke fragmen cache.

Sebelum memulai, perhatikan bahwa kerangka Komentar Django ditinggalkan, sejak versi 1.5. Sekarang Anda dapat menggunakan fitur eksternal untuk melakukannya, tetapi jika Anda masih ingin menggunakannya, fitur tersebut masih disertakan dalam versi 1.6 dan 1.7. Mulai versi 1.8 itu tidak ada tetapi Anda masih bisa mendapatkan kode di akun GitHub yang berbeda.

Kerangka komentar memudahkan untuk melampirkan komentar ke model apa pun di aplikasi Anda.

Untuk mulai menggunakan kerangka komentar Django -

Edit file project settings.py dan tambahkan 'django.contrib.sites', dan 'django.contrib.comments', ke opsi INSTALLED_APPS -

INSTALLED_APPS += ('django.contrib.sites', 'django.contrib.comments',)

Dapatkan id situs -

>>> from django.contrib.sites.models import Site
>>> Site().save()
>>> Site.objects.all()[0].id
u'56194498e13823167dd43c64'

Setel id yang Anda dapatkan di file settings.py -

SITE_ID = u'56194498e13823167dd43c64'

Sinkronkan db, untuk membuat semua tabel atau koleksi komentar -

python manage.py syncdb

Tambahkan URL aplikasi komentar ke urls.py proyek Anda -

from django.conf.urls import include
url(r'^comments/', include('django.contrib.comments.urls')),

Sekarang kita telah memasang kerangka kerja, mari kita ubah templat halo kita untuk melacak komentar pada model Dreamreal kita. Kami akan membuat daftar, menyimpan komentar untuk entri Dreamreal tertentu yang namanya akan diteruskan sebagai parameter ke / myapp / hello URL.

Model Dreamreal

class Dreamreal(models.Model):

   website = models.CharField(max_length = 50)
   mail = models.CharField(max_length = 50)
   name = models.CharField(max_length = 50)
   phonenumber = models.IntegerField()

   class Meta:
      db_table = "dreamreal"

halo lihat

def hello(request, Name):
   today = datetime.datetime.now().date()
   daysOfWeek = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
   dreamreal = Dreamreal.objects.get(name = Name)
   return render(request, 'hello.html', locals())

hello.html template

{% extends "main_template.html" %}
{% load comments %}
{% block title %}My Hello Page{% endblock %}
{% block content %}

<p>
   Our Dreamreal Entry:
   <p><strong>Name :</strong> {{dreamreal.name}}</p>
   <p><strong>Website :</strong> {{dreamreal.website}}</p>
   <p><strong>Phone :</strong> {{dreamreal.phonenumber}}</p>
   <p><strong>Number of comments :<strong> 
   {% get_comment_count for dreamreal as comment_count %} {{ comment_count }}</p>
   <p>List of comments :</p>
   {% render_comment_list for dreamreal %}
</p>

{% render_comment_form for dreamreal %}
{% endblock %}

Terakhir, pemetaan URL ke tampilan hello kita -

url(r'^hello/(?P<Name>\w+)/', 'hello', name = 'hello'),

Sekarang,

  • Di template kami (hello.html), muat kerangka komentar dengan - {% load comments%}

  • Kami mendapatkan jumlah komentar untuk objek Dreamreal melewati tampilan - {% get_comment_count untuk dreamreal as comment_count%}

  • Kami mendapatkan daftar komentar untuk objek - {% render_comment_list for dreamreal%}

  • Kami menampilkan formulir komentar default - {% render_comment_form untuk dreamreal%}

Saat mengakses / myapp / hello / steve Anda akan mendapatkan info komentar untuk entri Dreamreal yang bernama Steve. Mengakses URL itu akan membuat Anda -

Saat memposting komentar, Anda akan diarahkan ke halaman berikut -

Jika Anda membuka / myapp / hello / steve lagi, Anda akan melihat halaman berikut -

Seperti yang Anda lihat, jumlah komentar sekarang adalah 1 dan Anda memiliki komentar di bawah daftar baris komentar.

Django datang dengan kerangka kerja penghasil umpan sindikasi. Dengan itu Anda dapat membuat RSS atau Atom feed hanya dengan subclassingdjango.contrib.syndication.views.Feed class.

Mari membuat umpan untuk komentar terbaru yang dilakukan pada aplikasi (Juga lihat bab Django - Kerangka Komentar). Untuk ini, mari buat myapp / feeds.py dan tentukan feed kami (Anda dapat meletakkan kelas feed Anda di mana pun Anda inginkan dalam struktur kode Anda).

from django.contrib.syndication.views import Feed
from django.contrib.comments import Comment
from django.core.urlresolvers import reverse

class DreamrealCommentsFeed(Feed):
   title = "Dreamreal's comments"
   link = "/drcomments/"
   description = "Updates on new comments on Dreamreal entry."

   def items(self):
      return Comment.objects.all().order_by("-submit_date")[:5]
		
   def item_title(self, item):
      return item.user_name
		
   def item_description(self, item):
      return item.comment
		
   def item_link(self, item):
      return reverse('comment', kwargs = {'object_pk':item.pk})
  • Di kelas umpan kami, title, link, dan description atribut sesuai dengan RSS standar <title>, <link> dan <description> elemen.

  • Itu itemsmetode, kembalikan elemen yang harus dimasukkan dalam umpan sebagai elemen item. Dalam kasus kami, lima komentar terakhir.

  • Itu item_titlemetode, akan mendapatkan apa yang akan menjadi judul untuk item umpan kita. Dalam kasus kami, judulnya, adalah nama pengguna.

  • Itu item_descriptionmetode, akan mendapatkan apa yang akan menjadi deskripsi untuk item umpan kami. Dalam kasus kami, komentar itu sendiri.

  • Itu item_linkmetode akan membangun tautan ke item lengkap. Dalam kasus kami, Anda akan mendapatkan komentar.

Sekarang kita memiliki umpan kita, mari tambahkan tampilan komentar di views.py untuk menampilkan komentar kita -

from django.contrib.comments import Comment

def comment(request, object_pk):
   mycomment = Comment.objects.get(object_pk = object_pk)
   text = '<strong>User :</strong> %s <p>'%mycomment.user_name</p>
   text += '<strong>Comment :</strong> %s <p>'%mycomment.comment</p>
   return HttpResponse(text)

Kami juga membutuhkan beberapa URL di myapp urls.py kami untuk pemetaan -

from myapp.feeds import DreamrealCommentsFeed
from django.conf.urls import patterns, url

urlpatterns += patterns('',
   url(r'^latest/comments/', DreamrealCommentsFeed()),
   url(r'^comment/(?P\w+)/', 'comment', name = 'comment'),
)

Saat mengakses / myapp / latest / comments / Anda akan mendapatkan umpan kami -

Kemudian mengklik salah satu nama pengguna akan membawa Anda ke: / myapp / comment / comment_id seperti yang didefinisikan dalam tampilan komentar kami sebelumnya dan Anda akan mendapatkan -

Oleh karena itu, menentukan umpan RSS hanyalah masalah sub-klasifikasi kelas Umpan dan memastikan URL (satu untuk mengakses umpan dan satu untuk mengakses elemen umpan) ditentukan. Sama seperti komentar, ini dapat dilampirkan ke model apa pun di aplikasi Anda.

Ajax pada dasarnya adalah kombinasi teknologi yang diintegrasikan bersama untuk mengurangi jumlah pemuatan halaman. Kami biasanya menggunakan Ajax untuk memudahkan pengalaman pengguna akhir. Menggunakan Ajax di Django dapat dilakukan dengan langsung menggunakan pustaka Ajax seperti JQuery atau lainnya. Katakanlah Anda ingin menggunakan JQuery, maka Anda perlu mengunduh dan melayani perpustakaan di server Anda melalui Apache atau yang lain. Kemudian gunakan di template Anda, seperti yang mungkin Anda lakukan saat mengembangkan aplikasi berbasis Ajax.

Cara lain menggunakan Ajax di Django adalah dengan menggunakan kerangka Django Ajax. Yang paling umum digunakan adalah django-dajax yang merupakan alat yang ampuh untuk dengan mudah dan super cepat mengembangkan logika presentasi asinkron dalam aplikasi web, menggunakan Python dan hampir tanpa kode sumber JavaScript. Ini mendukung empat kerangka kerja Ajax paling populer: Prototipe, jQuery, Dojo dan MooTools.

Menggunakan Django-dajax

Hal pertama yang harus dilakukan adalah menginstal django-dajax. Ini dapat dilakukan menggunakan easy_install atau pip -

$ pip install django_dajax $ easy_install django_dajax

Ini secara otomatis akan menginstal django-dajaxice, yang dibutuhkan oleh django-dajax. Kemudian kita perlu mengkonfigurasi dajax dan dajaxice.

Tambahkan dajax dan dajaxice di project settings.py Anda di opsi INSTALLED_APPS -

INSTALLED_APPS += (
   'dajaxice',
   'dajax'
)

Pastikan di file settings.py yang sama, Anda memiliki yang berikut ini -

TEMPLATE_LOADERS = (
   'django.template.loaders.filesystem.Loader',
   'django.template.loaders.app_directories.Loader',
   'django.template.loaders.eggs.Loader',
)

TEMPLATE_CONTEXT_PROCESSORS = (
   'django.contrib.auth.context_processors.auth',
   'django.core.context_processors.debug',
   'django.core.context_processors.i18n',
   'django.core.context_processors.media',
   'django.core.context_processors.static',
   'django.core.context_processors.request',
   'django.contrib.messages.context_processors.messages'
)

STATICFILES_FINDERS = (
   'django.contrib.staticfiles.finders.FileSystemFinder',
   'django.contrib.staticfiles.finders.AppDirectoriesFinder',
   'dajaxice.finders.DajaxiceFinder',
)

DAJAXICE_MEDIA_PREFIX = 'dajaxice'

Sekarang buka file myapp / url.py dan pastikan Anda memiliki yang berikut ini untuk mengatur URL dajax dan memuat file js statika dajax -

from dajaxice.core import dajaxice_autodiscover, dajaxice_config
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from django.conf import settings

Then dajax urls:

urlpatterns += patterns('',
   url(r'^%s/' % settings.DAJAXICE_MEDIA_PREFIX, include('dajaxice.urls')),)
	
urlpatterns += staticfiles_urlpatterns()

Mari kita buat formulir sederhana berdasarkan model Dreamreal kita untuk menyimpannya, menggunakan Ajax (berarti tidak ada penyegaran).

Pertama-tama, kami membutuhkan formulir Dreamreal kami di myapp / form.py.

class DreamrealForm(forms.Form):
   website = forms.CharField(max_length = 100)
   name = forms.CharField(max_length = 100)
   phonenumber = forms.CharField(max_length = 50)
   email = forms.CharField(max_length = 100)

Kemudian kita membutuhkan file ajax.py di aplikasi kita: myapp / ajax.py. Di situlah logika kita, di situlah kita meletakkan fungsi yang akan menyimpan formulir kita kemudian mengembalikan popup -

from dajaxice.utils import deserialize_form
from myapp.form import DreamrealForm
from dajax.core import Dajax
from myapp.models import Dreamreal

@dajaxice_register
def send_form(request, form):
   dajax = Dajax()
   form = DreamrealForm(deserialize_form(form))
   
   if form.is_valid():
      dajax.remove_css_class('#my_form input', 'error')
      dr = Dreamreal()
      dr.website = form.cleaned_data.get('website')
      dr.name = form.cleaned_data.get('name')
      dr.phonenumber = form.cleaned_data.get('phonenumber')
      dr.save()
      
      dajax.alert("Dreamreal Entry %s was successfully saved." % 
         form.cleaned_data.get('name'))
   else:
      dajax.remove_css_class('#my_form input', 'error')
      for error in form.errors:
         dajax.add_css_class('#id_%s' % error, 'error')
			
   return dajax.json()

Sekarang mari kita buat template dreamreal.html, yang memiliki formulir -

<html>
   <head></head>
   <body>
   
      <form action = "" method = "post" id = "my_form" accept-charset = "utf-8">
         {{ form.as_p }}
         <p><input type = "button" value = "Send" onclick = "send_form();"></p>
      </form>
      
   </body>
</html>

Tambahkan tampilan yang menyertai template di myapp / views.py -

def dreamreal(request):
   form = DreamrealForm()
   return render(request, 'dreamreal.html', locals())

Tambahkan URL yang sesuai di myapp / urls.py -

url(r'^dreamreal/', 'dreamreal', name = 'dreamreal'),

Sekarang mari tambahkan yang diperlukan di template kita untuk membuat Ajax berfungsi -

Di bagian atas file tambahkan -

{% load static %}
{% load dajaxice_templatetags %}

Dan di bagian <head> dari template dreamreal.html kita tambahkan -

Kami menggunakan perpustakaan JQuery untuk contoh ini, jadi tambahkan -

<script src = "{% static '/static/jquery-1.11.3.min.js' %}" 
   type = "text/javascript" charset = "utf-8"></script>
<script src = "{% static '/static/dajax/jquery.dajax.core.js' %}"></script>

Fungsi Ajax yang akan dipanggil saat diklik -

<script>

   function send_form(){
      Dajaxice.myapp.send_form(Dajax.process,{'form':$('#my_form').serialize(true)});
   }
</script>

Perhatikan bahwa Anda memerlukan "jquery-1.11.3.min.js" di direktori file statis Anda, dan juga jquery.dajax.core.js. Untuk memastikan semua file statis dajax disajikan di bawah direktori statis Anda, jalankan -

$python manage.py collectstatic

Note - Terkadang jquery.dajax.core.js bisa hilang, jika itu terjadi, cukup unduh sumbernya dan ambil file itu dan letakkan di bawah folder statis Anda.

Anda akan melihat layar berikut, setelah mengakses / myapp / dreamreal / -

Saat mengirimkan, Anda akan mendapatkan layar berikut -