İçeriğe geç

Django Email Doğrulaması ile Kullanıcı Kaydı

Herkese merhaba. Bir web sitesine kayıt olduktan sonra e posta adresimizi doğrulamamız gerektiği isteğiyle bir çok defa karşılaşmışızdır. Doğrulanmış hesaplar ile parola sıfırlama, parola değiştirme işlemleri yapılabilmekte veya spam oluşumunun bir nebze de önüne geçilebilmekte.

Peki bunu Django ile geliştirilmiş bir sistemde nasıl yapabiliriz? Django’nun hali hazırdaki auth uygulaması bir çok yerleşik işlemi beraberinde getirsede e posta doğrulama bunlardan biri değil. Fakat bu özelliği ona kazandırmak çok çok basit. İsterseniz 3.parti bir uygulama ile bu işlemi halledebilirsiniz ya da kendiniz böyle bir sistem yazabilirsiniz.

Hazırsanız yeni bir proje oluşturarak başlayalım. (Django 2.2 sürümü kullanılmıştır)

Bulunulan dizine bir proje oluşturup accounts uygulaması oluşturuldu.

Yapılması gerekenler.

  • Email ayarları.
  • Kullanıcı kaydı.
  • Token oluşturucu.
  • Mail gönderimi.
  • Aktivasyon işlemi.
  • Giriş çıkış işlemleri ve url yönlendirmeleri.

settings.py dosyasında şu değişiklikleri yapın.

Hizmet aldığınız servisini bilgilerini giriyoruz. (Bu yazıda Gmail kullanılmaktadır. Hata alırsanız 3.parti uygulamalara izin verin ve capctha doğrulamasını kapatın.)

Kullanıcı kaydı.

Django’nun yerleşik kullanıcı kayıt formu UserCreationForm‘u kullanacağız fakat biraz özelleştirmemiz ve validasyon eklememiz gerekmekte.

accounts/forms.py

UserCreationForm user modelinden türetilen bir modelform. Dolayısıyla email alanı içermekte fakat herhangi bir validasyona tabi tutulmamakta. Bu yüzden Meta classı ile bu alanı ekliyoruz ve o adresin sistemde kayıtlı olup olmadığı kontrolünü ekliyoruz. Daha sonra save metodunu ezerek her kullanıcı kaydında formdan dönen email adresinin kayıt edilen kullanıcıya iliştirilmesini sağlıyoruz. is_active default kullanıcı modelinde gelen bir kullanıcı özelliği. Bool bir ifade tutmakta ve False değer taşıyan kullanıcının sisteme giriş yapmasını engellemekte. Bunu da ekliyoruz. Tamam görünüyor.

Token oluşturucu.

accounts/tokens.py

Django kullanıcı parola sıfırlama işlemleri fonksiyonlara ve token oluşturucuya sahiptir. Ama bunu farklı bir yolla yapar.

İlk olarak bir sistemde tek kullanımlık linkler veya kodlar üretilecekken unique olmasını gerektirecek işlemler yapılmalıdır. Mesela giriş için giriş koduna ihtiyacınız olan bir durumda kullanıcı tablosuna bir alan ekleyip her giriş isteği geldiğinde kod oluşturup oraya yazmak daha sonra doğrulayıp dump etmek çalışan bir yaklaşımdır ama her seferinde bu komutları koşturmak bir süre sonra kullanıcı sayısı arttığında yanlış bir yaklaşım olur. Django ise veritabanına müdahele etmeden token leri yönetebilir.  Oluşturulan tokene ihtiyaç duyulduğunda tokeni kontrol edebilir.

Bunun için default token üretecini miras alıp gerekli fonksiyonu ezip bir token üretici oluşturuyoruz ve dışarı aktarıyoruz. Bu üreteç kullanıcı id’si, isteğin yapıldığı zaman ve kullanıcı aktiflik durumuna göre(False) bir anahtar oluşturuyor.

Kullanıcı kaydı ve mail gönderimi.

accounts/views.py

Öncelikle diğer view larda da kullanılacak uzun bir import listesi var onları ekleyerek başlayalım.

Kayıt işlemi.

Gerekli sınıfları miras alıyoruz. Daha sonra hangi formla hangi template de çalışacağımızı işlemin başarılı olması durumunda mesajı ve döneceğimiz adresi belirtiyoruz. Form valid dönmüş ise mail konusunu belirliyoruz. urlsafe encode fonksiyonu ile url de kullanmak üzere bytestring base64 stringine kodluyoruz. Oluşturduğumuz üreteç ile bir token oluşturuyoruz. Sonraki iki satır mail istemcinize girmeye üşenirseniz diye 🙂 terminale çıktı göndermek için.

render_to_string ile bir template fonksiyonu. Amacı ilk argüman template’i yükleyip içine context göndermek ve template’de kullanılmasını sağlamak. render metodu gibi düşünebilirsiniz. send_mail fonksiyonuna ilk geçtiğimiz argüman mail konusu ve sonrasında sırasıyla mesaj, mail’i göndereceğimiz user, mail alıcısı fakat burası önemli gönderi listesi birden fazla olabileceği için ya liste ya da demet vermelisiniz. Tek elemanlı demet oluşturmak için virgül koymayı unutmayın 🙂 fail_silently default değeri False dur. Yani işlem başarısız ise debug ekranında hata gösterir.  True ya çekerek  bool bir ifade dönmesini sağlıyoruz ki işlemi kontrol edelim.

accounts/templates/accounts/activate_account.html

Gönderilecek mail.

accounts/templates/accounts/register.html

Aktivasyon.

Linke get isteği yapıldığındaki gerekli parametreleri belirliyoruz. Url’den (uidb64, token ve request[zorunlu]) gelecek. Kodladığımız uid parametresini çözüyoruz.  ve kullanıcıyı veritabanında o uid ile arıyoruz. Eğer yok ise basit bir cevap dönüyoruz. Fakat var ise oluşturduğumuz token üretecininin doğrulamasını kullanıyoruz. Token hala geçerli mi vs vs. Bizim oluşturduğumuz üreteçte bir geçerlilik tarihi yok. Kullanıcı is_active True işaretlenir ve mesaj eklenip anasayfaya gönderilir.

Kullanıcı giriş çıkış ve url yönlendirmeleri.

settings.py

Giriş veya çıkış yapıldığında redirect edilecek adresler.

email_login/templates/index.html

Anasayfa içeriği.

Url’de CBV ile view yazmadan template render edebilir veya giriş çıkış işlemlerini halledebilirsiniz.

Aktivasyon url’ine gerekli parametreleri geçip projeye son halini veriyoruz. LoginView ve LogoutView yerleşik auth view larını gereksiz uzayacağından burada açıklamıyorum.  Komple uygulamayı ele aldığım bir seri yazacağım. Detaylı bir şekilde Django ile nası token oluşturur ve kullanırız anlatmaya çalıştım umarım yararlı olmuştur projenin kaynak kodları için buraya tıklayabilirsiniz. İyi günler 🙂

 

 

 

 

 

 

 

 

Tarih:BlogDjango DersleriPython

İlk Yorumu Siz Yapın

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Göster
Gizle