14 Temmuz 2014 Pazartesi

Hata Raporlama

Django'da bir proje oluşturduğumuz o zaman varsayılan olarak hata ayıklama(DEBUG) kipi açık olur. Bu biz kodlarımızı yazarken yazım hatalarını bulabilmemizi sağlaması içindir. Yani var olan hata ile ilgili Django bizi bilgilendirir. Biz de bu bilgilendirme sayesinde nerede hata yaptığımız anlayabiliriz. Ama yaptığımız projeyi yayınlarken bu şekilde olması güvenlik açısından problem teşkil etmektedir. Bu şekilde kullanıcılar projemiz hakkında bilgi sahibi olabilir, yazdığımız kodların bir kısmını görebilirler. Kullanıcılar bu bilgileri kullanarak istemediğimiz sonuçlara sebep olabilir. Bu yüzden hata ayıklama kipini kapatıyoruz. Bunun için settings.py dosyası içerisindeki DEBUG değişkeninin değerini False yapıyoruz.
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False
Gördüğünüz gibi Django da bize hata ayıklama kipi açıkken projemizi yayınlamamız konusunda güvenlik uyarısı veriyor. Bu ayarı yaptıktan sonra projenizi başlatmak isterseniz şöyle bir hata alacaksınız.
$ python manage.py runserver
CommandError: You must set settings.ALLOWED_HOSTS if DEBUG is False.
Django bizi yine uyarıyor. Proje için izinli hostları belirtmemiz gerekiyor. Bunun yüzden settings.py dosyası içerisinde ALLOWED_HOSTS değişkenini içerisinde izinleri vermeliyiz.
ALLOWED_HOSTS = ['*']
İster bu şekilde tüm host'lara izin verebilirsiniz. Veya sadece kendi belirlediklerinizi izin verebilirsiniz.
ALLOWED_HOSTS = ['127.0.0.1','localhost']
Güvenlik açısından tavsiye edilen yöntem budur. Bunu yaptıktan sonra herhangi bir sayfayı açmaya çalıştığınızda style dosyalarının yüklenmediğini göreceksiniz. Bu ayarlamaları yaptıktan sonra statik (CSS dosyaları da dahil) dosyaların yüklenebilmesi için projemizi --insecure parametresi ile çalıştırmalıyız.
python manage.py runserver --insecure
Sunucu Hataları (500)
Sunucudan kaynaklanan hatalar. Projeyi geliştirirken yazdığımız kodlarda bir hata oluşursa Django bunu tarayıcıda bize basıyordu. Bu şekilde hata ile ilgili bizi bilgilendiriyordu. Örneğin;
Bu durum DEBUG = True olduğu durum için geçerlidir. Biz projemizde False yaptığımız için ekrana bu bilgi basılmayacaktır. Onun yerine ekranda sadece Server Error (500) yazar. Buradan da anlayabileceğiniz gibi hatanın kodu 500'dür. Yani aslında kullanıcıya 500.html sayfası gösterilir ve ardından settings.py dosyasında belirtilen ADMINS kullanıcılarına hata e-posta olarak gönderilir.
Şimdi settings.py dosyasında ADMINS değişkenine yönetici kullanıcıları belirtiyoruz.
ADMINS = (
    ('Mazlum Agar','mazlum.agar@gmail.com'),
)
Django tarafından gönderilen postaların kimin tarfından gönderilmesini istiyorsak SERVER_EMAIL değişkenine belirtiyoruz.
SERVER_EMAIL = 'Django Uyari <django@mail.com>'
Artık hata oluştuğunda gösterilecek 500.html sayfasını oluşturabiliriz. Bu sayfayı oluşturduktan sonra istediğiniz bir şablon dizine atabilirsiniz. Biz hastahane/sablonlar dizini içerisine atıyoruz.
hastahane/sablonlar/500.tml
<!DOCTYPE html>
<html>
<head>
    <title>Erişilemez</title>
</head>
<body>

<h2>Teknik hata</h2>


<p>Üzgünüz,sunucuda oluşan teknik bir hatadan dolayı istediğiniz sayfa gösterilemiyor.</p>

<img src="/dosyalar/500.jpg" />
</body>
</html>
Artık kullanıcılar şöyle bir sayfa görecekler.
Sayfa Bulunamadı (404)
Projede var olmayan bir url girildiğini Django bize yukarıdaki gibi sayfanın olmadığına dair bir hata basıyordu. Bu sayfada var olan tüm urlleri gösteriliyordu. Herhangi bir kullanıcının bu urlleri görmesi tehlikeli olabilir. Normal kullanıcılar için ise bu sayfa mantıklı olmayacaktır. Bu yüzden kendi 404 sayfamızı oluşturacağız. İlk önce şablon içerisinde request nesnesini ve django yönetim panelini kullanmak istersek settings.py dosyasına şu satırları ekliyoruz.
TEMPLATE_CONTEXT_PROCESSORS = (
     #Oluşturacağımız 404 sayfasında request nesnesini kullanmak için
    'django.core.context_processors.request',
     #Yönetim panelini kullanmak için
    'django.contrib.auth.context_processors.auth'
)
Son olarak 404.html sayfasını oluşturarak aynı dosya içerisine kaydedelim.
hastahane/sablonlar/500.tml
<!DOCTYPE html>
<html>
<head>
    <title>Sayfa Bulunamadı</title>
    <link rel="stylesheet" type="text/css" href="/static/base.css" />
</head>
<body>

<img src="/static/404.jpg" width="300" height="300"/>

<h2>Sayfa Bulunamadı</h2>

<p>Aradığınız sayfa buluanamadı.</p>

<br>Erişmek istediğiniz sayfa : <b>{{ request.build_absolute_uri }}</b>

</body>
</html>
Kullanıcı olmayan bir sayfaya ulaşmaya çalıştığı zaman;
Kaynakça

0 yorum :

Yorum Gönder