Django - Sesi

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 mengkonfigurasi 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). Izinkan 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, bergantung pada apakah cookie sesi pengguna telah kedaluwarsa saat browser web pengguna ditutup.