Flask Tutorial Error Handling

7-FlaskErrorHandling

Error Handling

  • Projemizde hata oluştuğunda hatanın tespiti için neler yapacağımızı bu bölümde göreceğiz.
  • Siz de web uygulamanızda ikinci bir kullanıcının kayıtlı olduğuna emin olarak login olduktan sonra kullanıcı adınızı(username) diğer kullanıcı adıyla aynı yapacak şekilde /edit_profile sayfasından değiştirin.

Sonuç :

err1

  • Projemiz yayında iken kullanıcının hata mesajı detaylarını görmemesi güvenlik açısından önemlidir. Ancak geliştirme aşamasında biz hata mesajlarını görmeliyiz.
  • Terminalden export FLASK_DEBUG=1 yaparak (windows için export yerine set) uygulamamızı DEBUG modda çalıştırıp tekrar username'i başka bir kullanıcı adıyla aynı yapmaya çalışın.
  • Ekran görüntüsü aşağıda göreceğiniz gibi Debugger is active!, Debugger PIN ... bilgileri görünüyor. debug_mode
  • DEBUG modda iken python modüllerinizde herhangi bir değişiklik yaptığınızda sunucu otomatik yeniden başlayacak yani sürekli programı yeniden başlatmak zorunda kalmayacaksınız.
  • Proje production(yayında, serverda)'da iken DEBUG modda ** OLMAMALI **. Kullanıcı debug modda iken uygulamamızda(projemizde) uzaktan kod çalıştırabilir. Saldırganlara bu hediyeyi vermek istemeyiz.
  • DEBUG modda iken aynı username ataması yapmaya çalıştığımızda:

err2

  • Daha detaylı hata mesajları aldık. Bu hata mesajı SQLAlchemy'den geliyor.
  • UNIQUE constraint failed... mesajından anlaşıldığı gibi uniqe belirlenmiş alana biz var olan kaydın aynısını atama yapmaya çalışınca hata verdi.
Custom Error Pages (Özel Hata Sayfaları)
  • Özel hata mesajları göstermek için Flask'in sunduğu @errorhandler(_hata_tipi_) decorator'ını kullanacağız.
  • myapp/errors.py modülünü oluşturalım
 
  • Gösterim methodlarına (view functions) benzer şekilde methodlarımızı yazdık.
  • Burada render_template methodundan sonra 404, 500 sayılarını görüyorsunuz. Varsayılan olarak 200 olduğu için view methodlarında yazmadık daha önce. Bu sayılar HTTP mesaj türlerini ifade etmektedir. Daha fazla bilgi için -> HTTP Messages
  • db.session.rollback() database session'ı resetler.
  • Şimdi templates/404.html sayfasını oluşturalım.
 
  • Ve templates/500.html sayfası
 

Son olarak Flask'in errors.py modülümüzü tanıması için myapp/__init__.py'a import edelim

 
  • Terminalden export FLASK_DEBUG=0 yaptıktan sonra tekrar username'i başka bir kaydın username'i ile aynı yapmaya çalışalım. Sonuç:

err4

Hata Mesajlarını Email Olarak Göndermek (Sending Errors by Email)
  • Hata mesajlarını uygulamamız terminale yazıyor. Ancak production'da kimse hata mesajlarına bakmayacak. Dolayısıyla herhangi bir hata olduğunda hemen görebilmek için hata mesajlarını email ile bildirmemiz yerinde olacaktır.
  • config.py modülümüze email için birkaç düzenleme yapalım.
 
  • Yorum satırı olarak bıraktıklarımız environment'da ayarlanmış SERVER, PORT .. vs. varsa onları alacaktır. Ancak burada biz string olarak manuel atama yaptık.
  • Burada google'ın sunduğu mail servislerini kullanıyoruz.
  • Flask log'lama yapmak için Python'ın logging paketini kullanır. Simple Mail Transfer Protocol Handler (SMTPHandler) ile hata bildirim emailini göndereceğiz.
 
  • Email gönderimi debug modda değilse ve konfigürasyonda mail server mevcutsa diye kontrol yaptık.
  • mail_handler.setLevel'a dikkat ederseniz sadece hata(ERROR) mesajlarını bildirecek şekilde düzenledik. Uyarı, bilgi, debug mesajları bildirilmeyecek şu anda.
  • Email gönderimini test etmek için 2 yöntem var. Birisi python'ın sunduğu SMTP debugging server. Gerçek bir email server kadar olmasa da emailleri kabul eden ancak email göndermek yerine maili terminale yazan testimizi kolayca yapabileceğimiz bir serverdır.
  • Şimdi ikinci bir terminal açıp aşağıdaki gibi email server'ı çalıştıralım.
 
  • Şimdi birinci terminalimize dönüp, server'ı localhost, port'u 8025, debug modu da False yani 0 yapalım.
 
  • Şimdi tekrar username'i başka kullanıcının username'i ile aynı yapalım tekrar hata mesajını yakalayalım. İkinci terminale bakacak olursak;
 
  • Terminalde hata mesajını ve hatanın hangi modüllerde hangi tür exception ve hatalara sebep olduğunu görebilirsiniz.
  • Email gönderimini test etmenin ikinci yöntemi GOOGLE'ın email serverını kullanmak. flask run yaptığınız terminalde aşağıdaki işlemleri de yapınız.
 
  • flask run dedikten sonra tekrar username başka kullanıcınınki ile aynı olacak şekilde test edin. Gmail adresinize güvenlik uyarısı maili gelecek.

gmail_err

  • Google oturum açma girişimini güvenlik nedenleri ile engelledi. Eğer Gmail ayarlarınızda düzenlemeleri yaparsanız gmail hesabınıza hata bildirim mesajlarını alabileceksiniz.

Logging to Files

  • Hata mesajlarını email üzerinden almak iyi bir yöntemdir ancak her zaman ve zeminde değil. Burada hata, bilgi, debug mesajlarını dosyalarda tutmayı göreceğiz.
  • myapp/__init__.py modülümüze aşağıdaki işlemleri uyguluyoruz.
 
  • Loglama işini de debug moda değilken yani production'da yapıyoruz.
  • Eğer logs adında bir klasör yoksa os.mkdir ile oluşturuyoruz.
  • RotatingFileHandler loglama için kullanışlı bir sınıftır. Uzun süre çalıştığında log dosyalarının çok büyümemesini garantiye alır. Burada 10 KB olarak belirledik. Ayrıca son 10 log dosyasını da back-up için tutmasını söyledik.
  • logging.Formatter loglamayı formatlı biçimde yapmamızı sağlıyor.
  • Burada loglama seviyesini INFO olarak tuttuk. Önem derecesine göre DEBUG, INFO, WARNING, ERROR ve CRITICAL seviyeleri artıyor.

Buraya kadar hata yakalama, özel hata mesajları, email bildirimi, loglama vs. gördük. Şimdi de kullanıcı adının (username) duplication problemini giderelim.

  • myapp/forms.py modülünde bir kaç değişiklik yapıyoruz.
 
  • EditProfileForm sınıfı çağırıldığında parametre olarak orjinal username alacak ve def validate_username methodu ile kullanıcı adını database'den kontrol edecek.
  • myapp/routes.py modülümüzde de EditProfileForm sınıfına başlangıç değeri olarak orjinal username'i verelim.
 
  • Son username testini yapalım. kayace kullanıcısı ile giriş yapıp adnan kullanıcısı ismiyle aynı kullanıcı adı vermeye çalışınca hata mesajını verdi.

dupplication_username

 

 

Yorumlar