PYTHON-DJANGO-BLOG PROJE ÇALIŞMASI 7 (Uygulamamızda Login-Logout işlemleri)

 Bir önceki yazımızda kullanıcılar sistemimize üye olabildi. Ama sisteme giriş yapmadılar. Bu yazımızda üyeliği başarıyla yapan kullanıcıların sisteme giriş işlemlerini anlatmaya çalışacağız.

Aşağıdaki işlemleri sırayla ve dikkatli bir biçimde yapalım.

1. login ve logout işlemleri için djangonun hazır sunduğu görünümleri projemize dahil edeilim. Bunun için projeniz-urls.py dosyasını açın ve aşağıdaki kodları ekleyin.

projenizin-urls.py dosyasında auth ile ilgili viewları auth_views olarak import edelim bunun için aşağıdaki kodu yazın.

from django.contrib.auth import views as auth_views

Ardından aynı dosyaya urlpatterns kısmına aşağıdaki path leri bildirelim. Böylece geliştirmeye hazırlandığımız dosyaların yolları tanımlanmış olacak. views altında django nun bizim için hazırladığı görünümleri kullanacağız. Bunun için LogoutView ve LoginView görünümlerinin hangi yolda çalışacağını belitmiş olduk.

urlpatterns = [

path('login/',auth_views.LoginView.as_view(template_name='users/login.html'), name='login'),
path('logout/',auth_views.LogoutView.as_view(template_name='users/logout.html'), name='logout'),

]

2. Şimdi sıra geldi. login.html ve logout.html dosyalarını oluşturalım. Bu dosyaları daha önce oluşturduğumuz register.html klasörüyle aynı dizine oluşturalım. 
Bunun için projemizde sırayla; 
    users app - templates-users- dizini altındaki register.html nin bulunduğu klasöre login ve logout dosyalarını ekleyin. Şimdi bu sayfaların hazırlanması aşamalarını görelim.

login.html sayfası işlem adımları aşağıdaki gibidir.

a. login.html dosyamız register.html dosyasının heme hemen aynısı olacak. Bu nedenle register.html dosyasındaki kodları login.html dosyasına kopyalayın. 

login.html dosyasındaki kodların son hali aşağıdaki gibidir.


{% extends 'blog/base.html' %}
{% load crispy_forms_tags %}
{% block content %}
<div class="content">
<form method="post">
{% csrf_token %}
<fieldset class="form-group">
<legend class="border-bottom mb-4">Log in- Giriş yap</legend>
{{ form|crispy }}
</fieldset>
<div class="form-group">
<button type="submit" class="btn btn-outline-info">Login-Girişyap</button>

</div>
</form>
<div class="border-top pt-3">
<small class="text-muted">
Yeni hesap oluştur<a class="ml-3" href="{% url 'register' %}"> Sign up-Hemen Üyelol-Sign up-</a>
</small>

</div>
</div>
{% endblock %}


NOT: login.html sayfamız artık hazır olduğu için register.html dosyamızda artık ilgili link eklenebilir.
register.html dosyasına login linki {% url 'login' %} tanımı eklenebilir eklendiği yer aşağıdadır:
<small class="text-muted">
Zaten üye misiniz? <a class="ml-3" href="{% url 'login' %}"> Sign in Giriş-Login-</a>
</small>

Şimdi login.html sayfanızı görüntüleyip deneyebilirsiniz bunun için:

RUNSERVER edildikten sonra tarayıcıda adres satırı aşağıdaki gibi yazılır ve ENTER a basılır sayfa çalışıyor mu test edebilir ve kayıtlı kullanıcı hesabıyla giriş yapmaya çalışabilirsiniz.
( sayfanız çalışıyor olmalı ancak doğru hesapla giriş yapsanızda sisteme girmek için urls tanımlaması yapmanızı isteyecek. )

>>>http://127.0.0.1:8000/login/

b. projenizde settings.py dosyasına açın ve en alta inip aşağıdaki kod satırını ekleyin:

LOGIN_REDIRECT_URL = "blog-home"
Böylece kayıtlı kullanıcının oturum açtığında hangi sayfaya yönlendirileceği belirlenmiş oldu.
Sisteme giriş yapan kayıtlı kullanıcı anasayafaya yönlendirilmiş oldu.

c. Şimdi de users app altında views da bir değişiklik yapmak gerekir. register isimli fonksiyonumuzda yeni üye olan kişiyi artık direk anasayafaya(blog-home) değil login olabileceği sayfaya yönlendirmek gerekir. 

Bunun için :
users app altındaki views.py dosyası içinde koddaki değişiklik aşağıdaki gibi olmalıdır.
(dikkat ederseniz f' string açıklaması değişti ve yönlendirilen sayfa blog-home yerine  login sayfamız oldu) 
users app- views.py
messages.success(request, f' hesabınız tanımlandı. Artık giriş yapabilirsiniz.')
return redirect('login')




c. logout.html sayfamızı da register.html den kopyalabiliriz. Ancak bazı kısımları silmemiz gerekir. 

logout.html dosyasının son hali şöyledir:
{% extends 'blog/base.html' %}

{% block content %}
<h2>Çıkış yaptınız.</h2>

<div class="border-top pt-3">
<small class="text-muted">
<a class="ml-3" href="{% url 'login' %}"> Tekrar giriş yap-Login-</a>
</small>

</div>

{% endblock %}

3. Sırada en üstteki navigasyon barıyla ilgili ayarlamalara geldi. Üye girişi yapmış bir kullanıcıya giriş yap(login) görünmemeli veya giriş yapmamış kişilere de login(giriş ) görünür durumda olması gerekir.
Bu durumu kontrol yapıları ile giriş yapılıp yapmadığını kontrol edebiliriz.

    Bu işlemler için aşağıdaki adımları izleyin.

a. base.html dosyasını açın navigasyonla ilgili html kodlarınız nerdeyse o dosyaya geçin yani navigasyon barda login-register linkleriniz neredeyse o kısmı bulun. Bu çalışmada navbar.html dosyası base.html dosyasına çağırılıyor. Bu nedenle şimdi yazacağız kodlar navbar.html dosyasına eklenir.(aslında iki dosya bu projede ilişkili zaten)

blog app altındaki navbar.html dosyasında son durum:
( dikkat ederseniz if yapısı kullanıldı. user.is_authenticated(login olmuş mu) şartı arandı. giriş yapılmışsa kullanıcılara navbar da logout linki gösterilecek aksi halde ise login ve üye ol(registration) gösterilecek.)

</li>

{% if user.is_authenticated %}
<a class="Logout" href="{% url 'logout' %}">Logout</a>
{% else %}
<li class="nav-link">
<a class="login" href="{% url 'login' %}">Login</a>
</li>
<li class="nav-link">
<a class="login" href="{% url 'register' %}">Register</a>
</li>
{% endif %}

</li>
şimdi RUNSERVER yapıp sistemin çalışığ çalışmadığını kontrol edebilirsiniz. navbar da artık oturum açıksa seçeneklerde sadece logout u görüyor olmalısınız. Yine navbar da henüz oturum açık değilse de login ve registration(üye ol) seçeneği görünür durumda olmasını sağladık.

4. Şimdi login olduğumuzda profil ayarları yapılması ve login olamayan birinin bu ayarlara ulaşamaması gibi kullanıcıya özel ayarlardan bazılarını görelim. 
Bu işlemler için bir kullanıcı giriş yaptığında ona özel bir sayfa yani  profili hazırlamak gerekir.  Kullanıcı sisteme giriş yaptığında bu profile bir rota oluşturmak gerekir. Şimdi bu işlemleri sırayla görelim.

a. O zaman users app de bir kullanıcı profili görünümü hazırlayalım. 

users app  altındaki views.py dosyasını açın ve aşağdaki kodu ekleyin.
(sonraki adımda profile.html dosyası oluşturulacak.) 

views.py içine:
def profile(request):
return render(request,'users/profile.html')

b. users app- templates altındaki users dizinide profile.html dosyası ekleyin.

profile.html dosyasındaki kodlar aşağıdadır:
(user.username django login olup olmadığını kontrol eden djangonun hazır sunduğu imkan)
{% extends 'blog/base.html' %}
{% load crispy_forms_tags %}
{% block content %}
<h1>{{ user.username }}</h1>
{% endblock %}

c. şimdi sıra geldi profile.html dosyasının yolunu-rotasını djangoda projeye bildirmeye geldi.

Project altındaki urls.py dosyasına girilir. Aşağıdaki path koda eklenir.

path('profile/',user_views.profile, name='profile'),
d.  Profille ilgili ayarlara ulaşabilmesi için navbar da profil seçeneğinin görünmesini sağlayalım. Bunun için navbar.html ( sizde base.html olabilir.) dosyasına girip profile.html linki oraya tanımlanması gerekir. 
Bunun için aşağıdaki kodu navbar.html  dosyasına ekleyin.( dikkat ederseniz aşağıdaki kodda sadece 2.satır yani profile isimli url de navbar a eklenmiş oldu-kodun diğer kısımları dosyamızda zaten vardı.)
{% if user.is_authenticated %}
<a class="Profile" href="{% url 'profile' %}">Profil</a>
<a class="Logout" href="{% url 'logout' %}">Logout</a>
RUNSERVER yapıp projeyi çalıştırabilir-kayıtlı bir kullanıcı hesabıyla giriiş yapıp profil e tıkladığınız da çalışıp çalışmadığını kontrol edebilirsiniz.

e. Şimdide projede henüz oturum açmadan  profilimize girmeye çalıştığında projemizin kullanıcıları login olabilecekleri sayfaya yönlendirmesini sağlayalım. Bu işlemler için aşağıdaki işlemleri dikkatli yapın.

Bunun için users app altındaki views.py e  üste import edilecek kodu girelim:

(Burada viewsdaki  profile isimli fonksiyon çalışmadan önce login_required isimli hazır fonksiyonu çağırdık(import ettik). 

from django.contrib.auth.decorators import login_required

not: Şimdi de dekoratörü(decorator) @ işareti kullanarak aşağıdaki konuma yerleştirelim.
( aşağıdaki işlem profile isimli fonksiyonumuz çalışmadan önce oturumun açık olup olmadığını kontrol eder ve oturum açık değilse fonksiyonu çalıştırmaz.)

@login_required
def profile(request):
return render(request,'users/profile.html')

Sırada projemizin login olmadan göremeyecekleri sayfaları görmeye çalıştıklarında onları login olacakları sayfaya yönledirmeyle ilgili setting.py dosyasına login_url sini tanımlamaya geldi.

settings.py dosyasının en altına eklenecek kod:
LOGIN_URL = "login"
Bu son yapılan işlem ile artık projede login olmadan girilmeye çalışılan yerler olursa kullanıcıyı login olma sayfasına yönlendirmiş olduk.


















Yorum Gönder

0 Yorumlar