29 Haziran 2014 Pazar

Şifre Sıfırlama

Kullandığımız her sistemde bir kullanıcı adı ve şifreye sahip oluruz. Bazen bu şifreyi unuttuğumuz zamanlar olabiliyor. Genel olarak da güvenli olması sebebi ile kullanılan mail adresine şifre sıfırlama parolası gönderilerek kullanıcılara ya yeni şifreleri otomatik olarak atanır yada yeni şifre oluşturabilecekleri bir link gönderilir. İşte şimdi bu işlemi Django'da yapacağız. Bu işlemleri Django otomatik olarak yapar. Bizim bazı tanımlamalar yapmamız gerekiyor hepsi bu. Kullanıcıya e-posta ile yeni şifre alabileceği bir link göndereceğiz.
E-Posta Ayarları
Bu linki gönderebilmek için bir e-posta sunucusuna ihtiyacımız olacak. Siz eğer isterseniz sisteminize bir MTA(Mail Transfer Agent) kurabilir ve mail gönderme işlemini onun üzerinden yapabilirsiniz. Biz google'ın bize sağlamış olduğu sunucuyu kullanacağız. Bunun için sadece bir gmail hesabımızın olması yeterli. İlk önce settings.py dosyasında e-posta ayarlarımızı yapacağız.
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'gmailhesabınız'
EMAIL_HOST_PASSWORD = 'gmailsifreniz'
DEFAULT_FROM_EMAIL = 'mailadresi'
EMAIL_PORT = 587
EMAIL_USE_TLS = True

Bu kodları settings.py dosyasına ekliyoruz.
Değişken Açıklama
EMAIL_HOST Posta sunucusunun ip adresi veya domaini. Eğer localda çalışan bir sunucu kullanıyorsanız localhost yazabilirsiniz. Yada doğrudan sunucunun ip adresini de yazabilirsiniz.
EMAIL_HOST_USER SMTP onaylaması isteniyorsa kullanıcı adı. Burada gmaili kullandığımız için gmail kullanıcı adımızı yazıyoruz.
EMAIL_HOST_PASSWPRD SMTP onaylaması isteniyorsa kullanıcı şifresi. Burda gmaili kullandığımız için gmail kullanıcı şifremizi yazıyoruz.
DEFAULT_FROM_EMAIL Kimden gittiği belli olmayan postalar için bu adresten gönderilir.
EMAIL_PORT Posta sunucusunun dinlediği port numarası.
EMAIL_USE_TLS Eğer SMTP sunucusu TLS kullanıyorsa TRUE yapmamız gerekir. Varsayılan olarak FALSE gelir. Genel olarak 587. portu dinleyen bağlantılar için kullanılır.
Sadece deneme yapmak için Python bize deneysel bir e-posta sunucusu sağlayabilir. Bunun için komut satırında şu komutu çalıştırın.
python -m smtpd -n -c DebuggingServer localhost:255
Bu komutu çalıştırdıktan sonra settings.py dosyasında yazdıklarımız için sadece şunları yazmanız yeterlidir.
EMAIL_HOST = 'localhost'
EMAIL_PORT = 2525
E-Posta Gönderme
Ayarlarımız yaptığımıza göre artık posta gönderebiliriz. İlk e-postayı python kabuğu ile gönderelim.
>>> from django.core.mail import send_mail
>>> send_mail('Test','Bu e-posta test amacı ile gönderilmiştir.','mazlum.agar@gmail.com',['mazlum.agar@hotmail.com'])
1
Eğer sizde de geriye 1 değeri döndürüldü ise posta gönderilmiş demektir. Eğer 1 değeri dönmez ise postanın neden gönderilmediğine dair ayrıntılı bilgi verilecektir.
send_mail fonksiyonundaki ilk argüman posta konusu, ikincisi posta içeriği, üçüncüsü kimden gideceği, dördüncüsü ise liste şeklinde postanın kimlere gideceği.
Eğer HTML içerikli bir posta göndermek isterseniz şu yöntemi kullanabilirsiniz.
>>> from django.core.mail import EmailMultiAlternatives
>>> konu = 'Test'
>>> kimden = 'mazlum.agar@hotmail.com'
>>> kime = 'mazlum.agar@gmail.com'
>>> metin_icerik = 'Test\n Bu bir test mailidir'
>>> html_icerik = '<h3>Test<h3><p>Bu bir test mailidir.</p>'
>>> posta = EmailMultiAlternatives(konu,metin_icerik,kimden,[kime])
>>> posta.attach_alternative(html_icerik,"text/html")
>>> 
>>> posta.send()
1
Site Adı
Hatırlarsanız Yönetim Paneli Sites Bölümünü Aktifleştirme yazısında Yönetim Panelinde Sites bölümünün nasıl aktifleştirileceğinden bahsetmiştik. İşte bu bölümden sitemizin alan ismini değiştirebiliriz. Django tüm siteler için varsayılan olarak example.com vermektedir.
Buradan site ismini değiştirebiliriz. Tabi her zaman olduğu gibi bu işlemi kabuktan nasıl yapabileceğimizi de gösterelim.
>>> from django.contrib.sites.models import Site
>>> site = Site.objects.get(id=1)
>>> site.name = "localhost"
>>> site.domain = "localhost:8000"
>>> site.save()
Şuan yerel makinede(localhost) çalıştığımız için bu şekilde yaptık. Gerçek bir projede site ismini yazmamız gerekir. Bu işlemi neden yaptık? Biraz sonra şifre sıfırlama işleminde mail gönderirken kullanıcıya yeni şifre oluşturabileceği bir link göndereceğiz. Django o linkte buraya yazdığımız site ismini kullanıyor. Eğer burayı düzeltmez ise link example.com ile başlayacaktır.
Şifre Sıfırlama Linkleri
urls.py dosyasında urlpatternsurlpatterns değişkenine aşağıdaki url'leri ekleyelim.
url(r'^accounts/password/reset/$',
        'django.contrib.auth.views.password_reset',
        {'post_reset_redirect':'/accounts/password/reset/done/'},
        name='password_reset'),

    url(r'^accounts/password/reset/done/$',
        'django.contrib.auth.views.password_reset_done',
        name='password_reset_done'),

    url(r'^accounts/password/reset/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$',
        'django.contrib.auth.views.password_reset_confirm',
        {'post_reset_redirect':'/accounts/password/done/'},
        name='password_reset_confirm'),

    url(r'^accounts/password/done/$',
        'django.contrib.auth.views.password_reset_complete',
        name='password_reset_complete'),
Tıpkı şifre değiştirme işleminde olduğu gibi şifre sıfırlarken de Django'nun Yönetim Panelini kullanacağız. Birazdan kendi şablonlarımızı da oluşturmayı göreceğiz. Url'leri eklediğimize göre taryıcıdan http://localhost:8000/accounts/password/reset/ yazdığınızda şifre sıfırlama penceresi ile karşılacaksınız.
Not: Bu url'leri istediğiniz gibi değiştirebilirsiniz.
Şifre sıfırlama linki için bizden e-posta istiyor. Burada kullanıcı kayıt olurken yazdığı e-postayı yazmak zorundadır. Şimdi kayıt olurken yazdığımız e-posta'yı girelim ve şifre sıfırlama mailini alalım. Gelen mail şu şekildedir.
Gördüğünüz gibi yeni şifre girebileceğimiz bir link gönderilmiş. Şimdi o linke tıklayalım.
Artık yeni şifremizi girebiliriz. Yönetim Paneli şablonlarını kullanarak şifre sıfırlamak bu kadar basit.
Kendi Şifre Sıfırlama Şablonlarımız
Şimdi Yönetim Paneli şablonlarını değilde kendi şablonlarımızı kullanarak şifre sıfırlama işlemini yapalım. Şifre değiştirme işleminde yaptığımız işlemlerin aynısı burası içinde geçerli. Tıpki şifre değiştirme şablonları gibi hastahane/hastahane/sablonlar/registration dosyası içerisine şablonlarımız oluşturuyoruz.
hastahane/hastahane/sablonlar/registration/password_reset_form.html
<!DOCTYPE html>
<html>
<head>
    <title>Şifre Sıfırlama İsteği</title>
     <link rel="stylesheet" type="text/css" href="/static/base.css" />
</head>
<body>
<h3>Şifre Sıfırlama</h3>
Şifrenizi unuttuysanız, aşağıdaki kutuya e-posta adresinizi giriniz. Size şifre sıfırlamanız için posta göndereceğiz.

<form action="" method="post">
    {% csrf_token %}
    {{form.email.errors}}
    <p>E-posta adresi:
    {{ form.email }}
    <input type="submit" value="Şifre Sıfırla" />
    </p>

</form>
</body>
</html>
hastahane/hastahane/sablonlar/registration/password_reset_done.html
<!DOCTYPE html>
<html>
<head>
    <title>Şifre Sıfırlama Tamamlandı</title>
    <link rel="stylesheet" type="text/css" href="/static/base.css" />
</head>
<body>

<h3>Şifre sıfırlama işlemi tamamlandı</h3>
Lütfen posta kutunuzu kontrol edin ve talimatları yerine getirin. Eğer e-posta alamadıysanız, doğru e-posta girdiğinizden emin olun.
</body>
</html>
hastahane/hastahane/sablonlar/registration/password_reset_email.html
{% autoescape off %}

Merhaba {{user.first_name}}

{{site_name}} web sitesinde şifre sıfırlama isteğinde bulunduğunuz için bu maili aldınız.
Eğer böyle bir istekte bulunmadıysanız bu maili göz ardı ediniz.

Lütfen, aşağıdaki linke tıklayarak yeni şifrenizi oluşturunuz.

{% block reset_link %}
{{protocol}}://{{domain}}{% url 'django.contrib.auth.views.password_reset_confirm' uidb64=uid token=token %}
{% endblock %}

Teşekkürler
{% endautoescape %}
hastahane/hastahane/sablonlar/registration/password_reset_confirm.html
<!DOCTYPE html>
<html>
<head>
    <title>Şifre Sıfırlama</title>
    <link rel="stylesheet" type="text/css" href="/static/base.css" />
</head>
<body>

{% if validlink %}

<h3>Şifre Sıfırlama</h3>

<form action="" method="post">
{% csrf_token %}
    <table border="1">
        {{form}}
    </table>
    <input type="submit" value="Şifre Değiştir" />
</form>
{% else %}
<p>Girdiğiniz link geçersiz. Şifre değiştirme isteğinde tekrardan bulunabilirsiniz.</p>
{% endif %}

</body>
</html>
Şablonlarımızı oluşturduk. Az önce Yönetim Paneli şablonlarını kullanırken yaptığımız işlemler aynen geçerli. Tarayıcıdan http://localhost:8000/accounts/password/reset/ yazarak şifre sıfırlama sayfasına gidiyoruz. Aşağıda kendi şablonlarımızın resimlerini görebilirsiniz.





Kullanıcı şifresini başarılı bir şekilde sıfırladık.
Kaynakça

2 yorum :

  1. Mazlum hocam size birkaç sorum olacak.
    ilkprojem diye bir proje oluşturmuştuk, aynı şekilde basit bir yapı ile örneğin ana sayfa, hakkımızda ve iletişim sayfası bulunan basit bir projeyi en baştan anlatma imkanınız var mıdır?
    bu video ile de olabilir, resim ile de farketmez.
    yani proje klasörünün içinde mi bulunmalı tüm dosyalar, bunu web de hosting üzerinden yayınlarkenki aşamaları falan da anlatırsanız çok minnettar kalırız.


    syg.

    YanıtlaSil
  2. İstediğiniz durum Adım adım Blog Yazma başlıklı yazı serisinde anlatılmıştır. Yazılar ilerleyen zamanlarda yayınlanacaktır.

    YanıtlaSil