Langkah 5: Mengautentikasi pengguna di Django
Langkah sebelumnya: Gunakan templat Proyek Web Django lengkap
Templat "Proyek Web Django" menyertakan alur autentikasi dasar, karena autentikasi adalah kebutuhan umum untuk aplikasi web. Saat Anda menggunakan salah satu templat proyek Django, Visual Studio menyertakan semua modul yang diperlukan untuk autentikasi dalam file settings.py proyek Django.
Dalam langkah ini, Anda mempelajari:
- Cara menggunakan alur autentikasi yang disediakan dalam templat Visual Studio (langkah 5-1)
Langkah 5-1: Menggunakan alur autentikasi
Langkah-langkah berikut menjalankan alur autentikasi dan menjelaskan bagian-bagian proyek:
Jika Anda belum mengikuti instruksi dalam file readme.html di akar proyek untuk membuat akun pengguna super (administrator), lakukan sekarang.
Jalankan aplikasi dari Visual Studio menggunakan Debug>Mulai Penelusuran Kesalahan (F5). Saat aplikasi muncul di browser, amati bahwa Masuk muncul di kanan atas bilah navigasi.
Buka templat/aplikasi/layout.html dan amati bahwa elemen
<div class="navbar ...>
berisi tag{% include app/loginpartial.html %}
. Tag{% include %}
menginstruksikan sistem templat Django untuk menarik konten file yang disertakan pada titik ini dalam templat yang berisi.Buka templat/aplikasi/loginpartial.html dan amati bagaimana menggunakan
{% if user.is_authenticated %}
tag kondisional bersama dengan tag{% else %}
untuk merender elemen UI yang berbeda tergantung pada apakah pengguna diautentikasi:{% if user.is_authenticated %} <form id="logoutForm" action="/logout" method="post" class="navbar-right"> {% csrf_token %} <ul class="nav navbar-nav navbar-right"> <li><span class="navbar-brand">Hello {{ user.username }}!</span></li> <li><a href="javascript:document.getElementById('logoutForm').submit()">Log off</a></li> </ul> </form> {% else %} <ul class="nav navbar-nav navbar-right"> <li><a href="{% url 'login' %}">Log in</a></li> </ul> {% endif %}
Karena tidak ada pengguna yang diautentikasi saat Anda pertama kali memulai aplikasi, kode templat hanya merender tautan "Masuk" ke jalur "login" relatif. Seperti yang ditentukan dalam urls.py (seperti yang ditunjukkan di bagian sebelumnya), rute tersebut dipetakan ke tampilan
django.contrib.auth.views.login
dan tampilan menerima data berikut:{ 'template_name': 'app/login.html', 'authentication_form': app.forms.BootstrapAuthenticationForm, 'extra_context': { 'title': 'Log in', 'year': datetime.now().year, } }
Di sini,
template_name
mengidentifikasi templat untuk halaman masuk, dalam hal ini templat/aplikasi/login.html. Propertiextra_context
ditambahkan ke data konteks default yang diberikan ke templat. Terakhir,authentication_form
menentukan kelas formulir untuk digunakan dengan login; dalam templat itu muncul sebagai objekform
. Nilai defaultnya adalahAuthenticationForm
(daridjango.contrib.auth.views
); templat proyek Visual Studio sebagai gantinya menggunakan formulir yang ditentukan dalam file forms.py aplikasi:from django import forms from django.contrib.auth.forms import AuthenticationForm from django.utils.translation import ugettext_lazy as _ class BootstrapAuthenticationForm(AuthenticationForm): """Authentication form which uses boostrap CSS.""" username = forms.CharField(max_length=254, widget=forms.TextInput({ 'class': 'form-control', 'placeholder': 'User name'})) password = forms.CharField(label=_("Password"), widget=forms.PasswordInput({ 'class': 'form-control', 'placeholder':'Password'}))
Seperti yang Anda lihat, kelas formulir berasal dari
AuthenticationForm
dan secara khusus mengambil alih bidang nama pengguna dan kata sandi untuk menambahkan teks tempat penampung. Templat Visual Studio menyertakan kode eksplisit ini pada asumsi bahwa Anda mungkin ingin menyesuaikan formulir, seperti menambahkan validasi kekuatan kata sandi.Saat Anda menavigasi ke halaman masuk, aplikasi akan merender templat login.html. Variabel
{{ form.username }}
dan{{ form.password }}
merender formulirCharField
dariBootstrapAuthenticationForm
. Ada juga bagian bawaan untuk menampilkan kesalahan validasi, dan elemen siap pakai untuk login sosial jika Anda memilih untuk menambahkan layanan tersebut.{% extends "app/layout.html" %} {% block content %} <h2>{{ title }}</h2> <div class="row"> <div class="col-md-8"> <section id="loginForm"> <form action="." method="post" class="form-horizontal"> {% csrf_token %} <h4>Use a local account to log in.</h4> <hr /> <div class="form-group"> <label for="id_username" class="col-md-2 control-label">User name</label> <div class="col-md-10"> {{ form.username }} </div> </div> <div class="form-group"> <label for="id_password" class="col-md-2 control-label">Password</label> <div class="col-md-10"> {{ form.password }} </div> </div> <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <input type="hidden" name="next" value="/" /> <input type="submit" value="Log in" class="btn btn-default" /> </div> </div> {% if form.errors %} <p class="validation-summary-errors">Please enter a correct user name and password.</p> {% endif %} </form> </section> </div> <div class="col-md-4"> <section id="socialLoginForm"></section> </div> </div> {% endblock %}
Saat Anda mengirimkan formulir, Django mencoba mengautentikasi kredensial Anda (seperti kredensial pengguna super). Namun, jika autentikasi gagal, Anda tetap berada di halaman saat ini,
form.errors
diatur ke true. Jika autentikasi berhasil, Django menavigasi ke URL relatif di bidang "berikutnya",<input type="hidden" name="next" value="/" />
, yang dalam hal ini adalah halaman beranda (/
).Sekarang, ketika halaman beranda dirender lagi, properti
user.is_authenticated
adalah true saat templat loginpartial.html dirender. Oleh karena itu, Anda melihat pesan Halo (nama pengguna) dan Log keluar. Anda dapat menggunakanuser.is_authenticated
di bagian lain aplikasi untuk memeriksa autentikasi.Anda perlu mengambil izin khusus pengguna dari database Anda untuk memeriksa apakah pengguna yang diautentikasi berwenang untuk mengakses sumber daya tertentu. Untuk informasi selengkapnya, lihat Menggunakan sistem autentikasi Django (dokumen Django).
Pengguna atau administrator super, khususnya, berwenang untuk mengakses antarmuka administrator Django bawaan menggunakan URL relatif "/admin/" dan "/admin/doc/." Untuk mengaktifkan antarmuka ini, ikuti langkah-langkah di bawah ini:
Instal paket Python docutils ke lingkungan Anda. Cara yang bagus untuk menginstal adalah dengan menambahkan "docutils" ke file requirements.txt Anda. Kemudian, buka Penjelajah Solusi, perluas proyek, perluas node Lingkungan Python, lalu klik kanan lingkungan yang Anda gunakan dan pilih Instal dari requirements.txt.
Buka file urls.py proyek Django dan tambahkan yang berikut ini:
from django.conf.urls import include from django.contrib import admin admin.autodiscover() urlpatterns = [ path('admin/doc/', include('django.contrib.admindocs.urls')) ]
Dalam file settings.py proyek Django, buka koleksi
INSTALLED_APPS
dan tambahkan'django.contrib.admindocs'
.Saat memulai ulang aplikasi, Anda dapat menavigasi ke "/admin/" dan "/admin/doc/" dan melakukan tugas seperti membuat lebih banyak akun pengguna.
Bagian terakhir dari alur autentikasi adalah pengelogan keluar. Seperti yang Anda lihat di loginpartial.html, tautan Log keluar hanya melakukan POST ke URL relatif "/login", yang ditangani oleh tampilan
django.contrib.auth.views.logout
bawaan. Tampilan ini tidak menampilkan UI apa pun dan hanya menavigasi ke halaman beranda (seperti yang ditunjukkan dalam urls.py untuk pola "^logout$"). Jika Anda ingin menampilkan halaman logoff, pertama-tama ubah pola URL sebagai berikut untuk menambahkan properti "template_name" dan menghapus properti "next_page":path('logout/', django.contrib.auth.views.logout, { 'template_name': 'app/loggedoff.html', # 'next_page': '/', }, name='logout')
Kemudian buat templat/aplikasi/loggedoff.html dengan konten (minimal) berikut:
{% extends "app/layout.html" %} {% block content %} <h3>You have been logged off</h3> {% endblock %}
Hasilnya muncul seperti di bawah ini:
Setelah selesai, hentikan server dan sekali lagi terapkan perubahan Anda ke kontrol sumber.
Pertanyaan: Apa tujuan tag {% csrf_token %} yang muncul di elemen <formulir>?
Jawaban: Tag {% csrf_token %}
mencakup perlindungan pemalsuan permintaan lintas situs (csrf) bawaan Django (dokumen Django). Anda biasanya menambahkan tag ini ke elemen apa pun yang melibatkan metode permintaan POST, PUT, atau DELETE, seperti formulir. Fungsi perenderan templat (render
) kemudian menyisipkan perlindungan yang diperlukan.
Langkah berikutnya
Catatan
Jika Anda telah menerapkan solusi Visual Studio Anda untuk kontrol sumber sepanjang tutorial ini, sekarang saat yang tepat untuk melakukan penerapan lain. Solusi Anda harus cocok dengan kode sumber tutorial di GitHub: Microsoft/python-sample-vs-learning-django.
Anda sekarang telah menjelajahi keseluruhan templat "Project Web Django Kosong" dan "Project Web Django" di Visual Studio. Anda telah mempelajari semua dasar-dasar Django seperti menggunakan tampilan dan templat. Anda juga telah menjelajahi perutean, autentikasi, dan model database yang digunakan. Anda sekarang dapat membuat aplikasi web Anda sendiri dengan tampilan dan model apa pun yang Anda butuhkan.
Menjalankan aplikasi web di komputer pengembangan Anda hanyalah suatu langkah dalam membuat aplikasi tersedia untuk pelanggan Anda. Langkah berikutnya mungkin mencakup tugas-tugas berikut:
Kustomisasi halaman 404 dengan membuat templat bernama templat/404.html. Saat ada, Django menggunakan templat ini alih-alih templat defaultnya. Untuk informasi selengkapnya, lihat Tampilan kesalahan dalam dokumentasi Django.
Menulis pengujian unit di tests.py; templat proyek Visual Studio menyediakan titik awal untuk ini, dan informasi lebih lanjut dapat ditemukan di Menulis aplikasi Django pertama Anda, bagian 5 - pengujian dan Pengujian di Django dalam dokumentasi Django.
Ubah aplikasi dari SQLite ke penyimpanan data tingkat produksi seperti PostgreSQL, MySQL, dan SQL Server (semuanya dapat dihosting di Azure). Seperti yang dijelaskan tentang Kapan menggunakan SQLite (sqlite.org), SQLite berfungsi dengan baik untuk situs lalu lintas rendah hingga menengah dengan kurang dari 100 K hits/hari. Namun, SQLite tidak direkomendasikan untuk volume yang lebih tinggi. SQLite juga terbatas pada satu komputer, sehingga tidak dapat digunakan dalam skenario multi-server seperti penyeimbangan beban dan replikasi geografis. Untuk informasi tentang dukungan Django untuk database lain, lihat Penyiapan database. Anda juga dapat menggunakan Azure SDK untuk Python untuk bekerja dengan layanan penyimpanan Azure seperti tabel dan blob.
Siapkan alur integrasi berkelanjutan/penyebaran berkelanjutan pada layanan seperti Azure DevOps. Selain bekerja dengan kontrol sumber (melalui Azure Repos atau GitHub, atau di tempat lain), Anda dapat mengonfigurasi Proyek Azure DevOps untuk menjalankan pengujian unit Anda secara otomatis sebagai prasyarat untuk rilis. Anda juga dapat mengonfigurasi alur untuk disebarkan ke server penahapan untuk pengujian lainnya sebelum menyebarkan ke produksi. Azure DevOps, selanjutnya, terintegrasi dengan solusi pemantauan seperti App Insights dan menutup seluruh siklus dengan alat perencanaan yang tangkas. Untuk informasi selengkapnya, lihat Membuat alur CI/CD untuk Python dengan proyek Azure DevOps dan juga dokumentasi Azure DevOps umum.
Mempelajari secara lebih mendalam
- Autentikasi pengguna di Django (docs.djangoproject.com)
- Kode sumber tutorial tentang GitHub: Microsoft/python-sample-vs-learning-django