Mantık çok basit aslında. Middleware denen classlar kullanıcıdan gelen
bir HTTP isteğinin django tarafından alınıp, işlenip, kullanıcıya geri
gönderilmesi aşamalarını manipüle etmenizi sağlar. Detaylara
inmeyeceğim.
Link'teki örnekten gideceğim. Neydi örneğimiz:
from django.contrib.auth.views import login
from django.http import HttpResponseRedirect
class SiteLogin:
def process_request(self, request):
if request.path != "/accounts/login" and request.user.is_anonymous():
if request.POST:
return login(request)
else:
return HttpResponseRedirect('/accounts/login/?next=%s'
% request.path)
Şimdi burada arkadaş bir middleware'de olması gereken metod olan
"process_request" metodunu override etmiş. Yani aslında django
kullanıcıdan gelen isteği execute edip herhangi bir cevap üretmemiş.
PS: Cevap üretme işlemi "process_view" metodunda, cevap'ın
gönderilmesi de "process_response" metodunda manipüle edilebilir.
Bu arkadaşın yazdığı koda göre web uygulamasına istek yapan bir
kullanıcının başına şunlar gelecek:
Kullanıcı siteye ilk kez girdiğinde eğer hiç login olmamış ise direk
olarak "/accounts/login/" url'ine gönderilecek. Geldiği sayfada eğer
login bilgilerini eksiksiz girerse login olacak. Login olmuşsa bir
dahaki HTTP isteklerinde her zaman request.user.is_anonymous() = False
olacağı için bu kod parçaşı çalıştırılmayacak. Aynısı şu şekilde de
yazılır. Bence daha anlaşılır:
/accounts/login/ aslında settings.py'de "LOGIN_URL" olarak
tanımlanmalıdır. eğer tanımlanmazsa django direk olarak kullanıcıların
login olma sayfasını "/accounts/login/" olarak kabul eder. Kullanıcıyı
oraya yönlendirir.
Ben settings.py dosyasında LOGIN_URL = "/user/login/" olarak
tanımlayacağım. LOGIN_URL ne demek şuraya bakabilirsiniz.
http://docs.djangoproject.com/en/dev/ref/settings/#login-url
from django.contrib.auth.views import login
from django.http import HttpResponseRedirect
from django.conf import settings
class SiteLogin:
def process_request(self, request):
if request.path != settings.LOGIN_URL and request.user.is_anonymous():
return HttpResponseRedirect('%s?next=%s' %
(settings.LOGIN_URL, request.path))
Bu kadar. Bu ne yapar? Anonim olan bütün kullanıcıları , /user/login/
url'ine yönlendirir. O url'de de django'nun built-in login view'ini
çalıştırmanız gerekmektedir.
Şöyleki:
(r'^user/login/$', 'django.contrib.auth.views.login')
Yada kendinizde bir tane view yazabilirsiniz. Ama gerek yok.
2010/1/25 "H.İbrahim YILMAZ" <[email protected]>:
> ozgurv yazmış:
>> (r'^accounts/login/$', 'deneme.middleware.SiteLogin') yerine şöyle
>> yapmalısın:
>>
>> (r'^accounts/login/$', 'django.contrib.auth.views.login'),
>>
>> Ayrıca arkadaş şöyle bir şey yazmı$.
>>
>> ***************
>> Then put 'myproject.middleware.SiteLogin' in your MIDDLEWARE_CLASSES
>> in settings.py (replace myproject with your project name) and you're
>> done!
>> ***************
>>
>> Bunu yaptın mı? Ayrıca burada eksik söylenmiş. Suna da dikkat
>> etmelisin. Middleware sırası önemlidir. Burada arkadaşın yazdığı kodda
>> exception almaman için 'myproject.middleware.SiteLogin' middleware
>> classını
>> "django.contrib.auth.middleware.AuthenticationMiddleware" classından
>> sonra yazman gerekir. Yani örneğin şöyle:
>>
>> MIDDLEWARE_CLASSES = (
>> "django.middleware.gzip.GZipMiddleware",
>> "django.contrib.sessions.middleware.SessionMiddleware",
>> "django.middleware.locale.LocaleMiddleware",
>> "django.middleware.transaction.TransactionMiddleware",
>> "django.contrib.auth.middleware.AuthenticationMiddleware",
>> "django.middleware.common.CommonMiddleware",
>> "myproject.middleware.SiteLogin" # en sonra koyman mantıklı burada
>> )
>> gibi ...
>>
>> 4) Tüm sitenin login olduktan sonra görülmesi için bundan daha basit
>> anlaşılır bir yapı var.
>>
>>
>> 2010/1/25 ozgurv <[email protected]>:
>>
>>> Exception sayfasında gelen tüm hatayı kopyalar mısın?
>>>
>>> 2010/1/25 "H.İbrahim YILMAZ" <[email protected]>:
>>>
>>>> Merhaba,
>>>> http://superjared.com/entry/requiring-login-entire-django-powered-site/
>>>> tüm sitenin sadece login olarak girilmesi amacıya yukardaki sitedeki
>>>> söyleneni yaptım. Fakat hangi url'e girersem gireyim aşağıdaki hatayı
>>>> alıyorum:
>>>> TypeError at /accounts/login/ this constructor takes no arguments
>>>>
>>>> Anlamadığım bir kaç soru var bu konuyla alakalı.
>>>> 1)Djangonun default login path'i kullanıldığında, kök dizin altına
>>>> /accounts/login/index.html gibi bir klasör/dosya mı oluşturmak
>>>> gerekiyor? yoksa /templates/accounts/login/index.html şeklinde mi? (her
>>>> iksinde de sonuç aynı maalesef :( )
>>>> 2)Yoksa django endisi otomatik bir login ekranı mı sunuyor?
>>>> 3)Yukardaki adresteki yapının url tanımlaması nasıl yapacağız? Ben şu
>>>> şekilde yaptım :
>>>> (r'^accounts/login/$', 'deneme.middleware.SiteLogin'),
>>>> 4)Tüm sitenin login olduktran sonra görülmesi için. Bundan daha basit
>>>> anlaşılır bir yapı var mı?
>>>> Not: Djangobook'u ve djangonun kendi sitesindeki belgelei okudum hiç bir
>>>> şey anlamadım (bu konuyla alakalı) desem yeridir. Şu konuyu da sizlerin
>>>> yardımıyla anlasam sanırım büyük bir olayı atlatmış olacağım.
>>>> Saygılarımla.
>>>>
>>>> --
>>>> H.İbrahim YILMAZ
>>>> Sales & Technical Manager
>>>> Marmara Bilişim
>>>> Hürriyet Sokak 6/A YALOVA
>>>> Tel: +90 226 813 3131
>>>> http://www.bilisimmarmara.com.tr
>>>>
>>>> _______________________________________________
>>>> Linux-programlama mailing list
>>>> [email protected]
>>>> http://liste.linux.org.tr/mailman/listinfo/linux-programlama
>>>> Liste kurallari: http://liste.linux.org.tr/kurallar.php
>>>>
>>>>
>>>
>>> --
>>> Özgür Vatansever
>>>
>>>
>>
>>
>>
>>
> Merhaba Özgür Bey,
> Zaten bahsedildiği gibi yaptım. Sadece regex'te hata yapmışım. Fakat
> benim esas sorunum, mantığı anlayamamak. Yani bu bana bir login sayfası
> yaratacak mı? Şu anda denemem mümkün değil yarın sonucu bildireceğim.
>
> 4) Tüm sitenin login olduktan sonra görülmesi için bundan daha basit
> anlaşılır bir yapı var.
>
> Nedir acaba? Öğrenmeyi çok isterim.
> Saygılarımla.
>
> _______________________________________________
> Linux-programlama mailing list
> [email protected]
> http://liste.linux.org.tr/mailman/listinfo/linux-programlama
> Liste kurallari: http://liste.linux.org.tr/kurallar.php
>
--
Özgür Vatansever
_______________________________________________
Linux-programlama mailing list
[email protected]
http://liste.linux.org.tr/mailman/listinfo/linux-programlama
Liste kurallari: http://liste.linux.org.tr/kurallar.php