Flask Tutorial Profile Page

6-FlaskProfilePage

Profile Page and Avatars (Profil Sayfası ve Avatarlar)

  • Bu bölümde belirli bir kullanıcı için profil sayfasını oluşturmayı ve kullanıcıya avatar ekleme işlemini göreceğiz.
  • myapp/routes.py modülünde def user(username) adında bir method açıyoruz.
 
  • Diğer URL'lerden farklı olarak en sonda < > işaretleri kullanılarak ve içine de username parametresi alan bir URL belirledik. Bu demek oluyor ki URL sonuna gelecek username ile her kullanıcı ismine özel profil sayfası görüntülenecek. Örneğin /user/adnan dediğimizde adnan kullanıcısına ait profil sayfasını göreceğiz.
  • def user(username) methoduna dikkat ederseniz, method parametresi ile URL parametresi aynı string olarak belirlenmelidir. def user(kullanici) dediğimizde hata ile karşılaşacağız. Stringlerin aynı olmasına dikkat edelim.
  • .first_or_404() methodu first() methodunda farklı olarak, eğer kullanıcı yoksa 404 hatası dönecek.
  • posts değişkeni ile de gösterim amaçlı geçici obje oluşturduk.
  • templates/user.html dosyasını oluşturalım.
 
  • base.html'e de aşağıdaki satırı ekleyelim.
 
  • Burada url_for methodunun ek olarak username parametresi aldığını görüyorsunuz. Mevcut kullanıcıyı (current_user.username) url_for methoduna verdik.

profile1

Avatar

  • Profil sayfasını biraz daha güzelleştirmek için kullanıcılara avatar ekleyelim.
  • Gravatar - Globally Recognized Avatars sitesinin sağladığı avatar oluşturma servisini kullanacağız. Büyük boyutlu resimler yüklemek yerine şimdilik bunu kullanalım.
  • https://www.gravatar.com\/avatar/<hash> URL'ine kullanıcı e-mailini md5 ile hash'leyip vereceğiz. Örnek kullanım:
 
  • s parametresi ile size, d parametresi ile avatar kaydı yapmamış kullanıcılara random avatar üretir.
  • myapp/models.py'da User modeline aşağıdaki methodu ekliyoruz.
 
  • user.html'i aşağıdaki gibi düzenleyelim.
 

profile2

Sub Templates
  • Jinja2'nun bize sunduğu include sayesinde bir template'i başka bir template içerisine dahil edebiliriz.
  • _post.html adında bir sub template oluşturalım.
 
  • user.html'e bu template'i dahil edelim.
 

profile3

'Hakkımda' bilgisi ve 'Son görülme tarihi' bilgisi ekleme
  • Kullanıcı profillerine about_me ve last_seen ekleyelim.
  • myapp/models.py modülünü aşağıdaki gibi düzenleyelim.
 
  • Şimdi modelimizin tablolarının oluşması için migration yapalım.
 
  • upgrade komutunu unutmuyoruz.
 

Last seen (Son görülme) için myapp/routes.py modülünde düzenleme yapalım.

 
  • @app.before_request decorator Flask'ın bize sunduğu özelliktir. Gösterim fonksiyonları( template'leri render eden methodlar ) çalışmadan önce before_request çalıştırılacak.
  • before_request methodumuz kullanıcının log-in olup olmadığına bakıyor.
  • Lokal zaman bilgisi yerine UTC zaman bilgisi kullanıyoruz yeniden.
  • current_user referansını çağırdığımız zaman Flask-Login user loader callback fonksiyonunu çağırır. Bu fonksiyon mevcut user objesini database session'a ekler. Yani db.session.add uygulanır. Burada ikinci kez db.session.add yazmamıza gerek yok.
  • Profil sayfalarını yeniden görüntülediğinizde son görülme tarihini göreceksiniz.
  • Bir kaç kullanıcı açıp onların profillerine girip son görülme tarihlerini görebilirsiniz.

profile4

Profil Sayfası Düzenleme Formu (Editing Profile)

  • Profil sayfasını düzenlemek için bir adet form ekleyelim. myapp/forms.py modülünde:
 
  • Burada TextAreaField kullandık. Hakkımda yazısı uzun olabilir.
  • validators kısmında da Length kullandık. Kullanıcı minimum ve maksimum belirlenen karakter sayısı girebilir.

Şimdi profil düzenleme form template'ini oluşturalım. templates/edit_profile.html

 

Ve son olarak gösterim fonksiyonunu (view function) yazlım. myapp/routes.py

 
  • Eğer kullanıcı formu submit etmişse (yani form bilgilerini doldurup kaydet, submit butonuna basmışsa) ; formdan alınan username ve about_me bilgilerini sisteme giriş yapmış kullanıcının(current_user) username ve about_me alanlarına atama yapıyoruz.
  • Değişiklikler sonrası edit_profile sayfasına flash ile bilgi mesajı bırakıyoruz.
  • Eğer kullanıcı formu submit etmemişse; form alanlarına mevcut kullanıcının(current_user) username ve about_me bilgilerini dolduruyoruz(yerleştiriyoruz). Böylece kullanıcı profil düzenle dediği zaman varsa eski bilgileri form alanlarında görülecek.

Son olarak profil düzenleme sayfasına gitmek için bir link ekleyelim. templates/user.html içerisine aşağıdaki satırı ekliyoruz.

 
  • Burada {% if user == current_user%} kontrolü ile user , sisteme giriş yapmış current_user olmalı. Yani kullanıcı sadece kendi profilini düzenleyebilmeli!

profie_about1

Submit sonrası ...

profie_about2

 

 

 

Yorumlar