Selamlar dostlar! Ben @an0un ve bugün daha önce yaptığımız Kayıt Sistemi'ne eklediğimiz güncellemeler ile sizlere bunu nasıl yapabileceğinizi, kodun ne işe yaradığını vb. göstereceğim. Umarım faydalı olur, hadi başlayalım.
İlk önce temel Firebase işlemlerimizi hatırlayalım.
Bunun için sizleri önceki konuma yönlendireceğim.
Şimdi size bu kodun / programın amacından bahsedeyim. 3 dosyamız var, kayit.py - userpanel.py - admin.py
Bu 3 dosyayı kendinize göre .exe formatına çevirip istediğiniz şekilde kullanıcıya sunabilirsiniz. kayit.py dosyamınız amacı, kullanıcının sisteme kayıt olabilmesini sağlamak. userpanel.py dosyamızın amacı, kullanıcının hesabına giriş yapabilmesi ve hesabına e-posta adresi ekleyebilmesini sağlar. Daha sonraki güncellemelerde kullanıcı adını değiştirebilecek, profil fotoğrafı ekleyebilecek. Bu kod sadece Doğrulanmış veya Doğrulanmamış kullanıcıların oturum açabilmesini sağlar. admin.py dosyasına gelirsek, bu dosya da sadece Adminlerin giriş yapabilmesini sağlar. Ayrıca Adminler bu kod sayesinde Doğrulanmamış türündeki kullanıcıları doğrulayabilme yetkisine sahip.
Python:
from firebase import firebase
import flet
from flet import Page, Text, ElevatedButton, TextField, Column
firebase = firebase.FirebaseApplication('firebase_url',None)
def kayitsistemi(page: Page):
page.title = "Kayıt Sistemi"
def kayitol(e):
col.controls = [username, password, passwordonayla, t1, onaylab2]
col.update()
def onaylab2(e):
if (username.value.strip() in firebase.get(f"users/dogrulanmamis/", '') or
username.value.strip() in firebase.get(f"admin/", '') or
username.value.strip() in firebase.get(f"users/dogrulanmis/", '')):
t1.value = 'Böyle Bir Hesap Zaten Mevcut!'
else:
if password.value == passwordonayla.value:
data = {'username':username.value.strip(), 'password':int(password.value.strip()),'email':''}
firebase.patch(f"users/dogrulanmamis/{username.value.strip()}",data)
t1.value = 'Hesabınız Oluşturuldu! Lütfen Giriş Yapınız!'
else:
t1.value = 'Şifreler Uyuşmuyor. Tekrar Deneyiniz!'
t1.update()
username = TextField(label="Kullanıcı Adı", hint_text="Kullanıcı Adınızı Giriniz")
password = TextField(label="Şifre", hint_text="Şifrenizi Giriniz",password=True)
passwordonayla = TextField(label="Şifrenizi Onaylayın", hint_text="Şifrenizi Tekrar Giriniz", password=True)
t1 = Text(value="")
b2 = ElevatedButton(text="Kayıt Ol", on_click=kayitol, width=page.width)
onaylab2 = ElevatedButton(text="Onayla",on_click=onaylab2, width=page.width)
col = Column(controls=[t1,b2],width=page.width,height=page.height,alignment="center", horizontal_alignment="center")
page.controls.append(col)
page.update()
flet.app(target=kayitsistemi)
Bu, kayit.py dosyamızın kodu. Analizimize geçelim.
Parça parça anlatmayacağım, zaten kod kısa. Başta kütüphanelerimizi import ettik, yani kütüphanelerimizi kodumuza aktardık.
firebase adlı değişkenimize Firebase Application'umuzu tanımladık. firebase_url yazan bölüme Firebase'deki Realtime Database'nin içinde size verilen URL'yi yapıştırın. kayitsistemi adında bir fonksiyon oluşturduk ve flet'in Page fonksiyonunu page değişkenine tanımladık. Bunu page : Page ile yaptık. İlk yazdığımız page'yi istediğiniz gibi değiştirebilirsiniz fakat daha sonrasında alt kodlardaki page yazılarını da değiştirmeyi unutmayın, unutursanız hata alırsınız. kayitol ve onaylab2 fonksiyonları oluşturduk. Parametrelerini e olarak ayarladık. Bu e'yi kullanmıyoruz fakat fonksiyon parametresi olarak kullanmak zorundayız, sebebini bilmiyorum böyle öğrendim. Bilen varsa bizi aydınlatabilir.
Her neyse, devam edelim.
kayitol fonksiyonumuzda col adlı Column'daki itemleri ayarladık, col'u update ettik. onaylab2 fonksiyonunda ise girilen kullanıcı adının veri tabanımızdaki users/dogrulanmis - users/dogrulanmamis ve admin klasörleri içerisinde olup olmadığına baktık. Eğer varsa Böyle Bir Hesap Zaten Mevcut! yazısını t1 adlı Text'imize aktardık. Bu Text aracına Label olarak aşinasınızdır. Eğer değilse yani eğer kullanıcı admınız bu 3 dizinde yoksa kullanıcının girdiği password ve passwordonayla TextField'lerimizdeki değerlerin birbiriyle aynı olup olmadığına baktık. Bu TextField dediğimiz şeye de TextBox olarak aşinasınız. Eğer öyleyse data diye bir değişken oluşturduk, veri tipimiz dictionary olacak şekilde içerisine 3 farklı key ve 3 farklı değer girdik. email Key'inin değerini boş bırakma sebebimiz şu: Kullanıcıdan E-Posta girmesini istemedik. Siz kodu değiştirecekseniz ekleyebilirsiniz. Bunu istemedik çünkü bunu userpanel.py dosyamızda istiyoruz. Devam edelim. firebase.patch() kullanarak data değişkenimizin Key'lerini, değerlerini users/dogrulanmamis dizininin içinde oluşturduk. Neden firebase.post() yerine firebase.patch() kullandığımızı yine bir önceki konuda anlattım. Eğer öyle değilse Şifreler Uyuşmuyor. Tekrar Deneyiniz! mesajını t1 değişkenimize yansıttık. Aşağıdaki kodlarda ise ElevatedButtonları, TextFieldleri, Textleri falan ayarladık. Şimdi userpanel.py dosyamıza geçelim.
Python:
from firebase import firebase
import flet
from flet import Page, Text, ElevatedButton, TextField, Column
import os
firebase = firebase.FirebaseApplication('firebase_url',None)
bilgisayar_adi = os.getlogin()
dogrulama1 = 0
dogrulama = 0
def usersistem(page : Page):
page.title = "Kullanıcı Paneli"
def userpanel(e):
print("userpanel fonksiyonu çağrıldı")
metin = ""
global dogrulama, dogrulama1, konum, emailt
emailt = ""
if dogrulama1 == 1:
if dogrulama == 1:
metin = f"{username.value.strip()} | Hesap Durumu: Doğrulanmış"
konum = f"users/dogrulanmis/{username.value.strip()}/"
emailt = Text(value=firebase.get(konum, 'email'))
else:
if dogrulama == 0:
metin = f"{username.value.strip()} | Hesap Durumu: Doğrulanmamış"
konum = f"users/dogrulanmamis/{username.value.strip()}/"
emailt = Text(value=firebase.get(konum, 'email'))
t1.value = metin
if "" == firebase.get(konum, 'email'):
col.controls = [t1, email, emailonayla]
else:
col.controls = [t1, emailt]
page.update()
def emailonayla2(e):
konuum = ""
if email.value.strip() != "":
if "@" in email.value.strip():
if dogrulama == 0:
firebase.delete(f"users/dogrulanmamis/{username.value.strip()}",'email')
firebase.patch(f"users/dogrulanmamis/{username.value.strip()}",{'email':email.value.strip()})
konuum = f"users/dogrulanmamis/{username.value.strip()}"
t2 = Text(value="e-Posta Adresiniz Eklendi!")
col.controls = [t1,emailt,t2]
if dogrulama == 1:
firebase.delete(f"users/dogrulanmis/{username.value.strip()}",'email')
firebase.patch(f"users/dogrulanmis/{username.value.strip()}",{'email':email.value.strip()})
konuum = f"users/dogrulanmis/{username.value.strip()}"
t2 = Text(value="e-Posta Adresiniz Eklendi!")
col.controls = [t1,emailt,t2]
else:
t2 = Text(value=firebase.get(konuum,'email'))
col.update()
def onaylab1(e):
global dogrulama
global dogrulama1
if username.value.strip() in firebase.get(f'users/dogrulanmis/', ''):
if ((username.value.strip() == firebase.get(f'users/dogrulanmis/{username.value.strip()}','username')) and
(int(password.value.strip()) == firebase.get(f'users/dogrulanmis/{username.value.strip()}','password'))):
dogrulama1 = 1
dogrulama = 1
col.controls = [t1,b1, email, emailonayla]
else:
t1.value = "Kullanıcı Adı veya Şifre Hatalı!"
if username.value.strip() in firebase.get(f'users/dogrulanmamis/', ''):
if ((username.value.strip() == firebase.get(f'users/dogrulanmamis/{username.value.strip()}','username')) and
(int(password.value.strip()) == firebase.get(f'users/dogrulanmamis/{username.value.strip()}','password'))):
dogrulama1 = 1
dogrulama = 0
col.controls = [t1, b1, email, emailonayla]
else:
t1.value = "Kullanıcı Adı veya Şifre Hatalı!"
if username.value.strip() in firebase.get(f'admin/', ''):
if (username.value.strip() == firebase.get(f'admin/{username.value.strip()}','username')):
t1.value = f"Admin Hesabı. Lütfen Admin Paneli Üzerinden Giriş Yapınız."
dogrulama1 = 0
else:
t1.value = "Kullanıcı Adı veya Şifre Hatalı!"
page.update()
username = TextField(label="Kullanıcı Adı", hint_text="Kullanıcı Adınızı Giriniz")
password = TextField(label="Şifre", hint_text="Şifrenizi Giriniz", password=True)
email = TextField(label="e-Posta Adresi",hint_text="e-Posta Adresinizi Giriniz")
t1 = Text(value="")
b1 = ElevatedButton(text=f"Giriş İşlemini Onaylıyor musunuz?", on_click=userpanel, width=page.width)
onaylab1 = ElevatedButton(text="Giriş Yap", on_click=onaylab1, width=page.width)
emailonayla = ElevatedButton(text="e-Posta Adresini Onayla", on_click=emailonayla2, width=page.width)
col = Column(controls=[username, password, t1, onaylab1], width=page.width, height=page.height, alignment="center",horizontal_alignment="center")
page.controls.append(col)
page.update()
flet.app(target=usersistem)
Evet, bu userpanel.py dosyamınız kodu. Bu kod en karışığı diyebilirim, en azından benim için öyle. Yazarken gerçekten zorlandığım kodlardan bir tanesi. Hadi analize geçelim.
İlk başta yine kütüphanelerimizi import ettik, yani kodumuza aktardık.
dogrulama1 ve dogrulama değişkenlerimizin değerlerini 0 olarak ayarladık. Şimdi sizlere bu 2 değişkeni açıklayayım. Bunlar bize lazım olacak, iyice anlamanız lazım. Arada ben bile karıştırıyorum diyebilirim. dogrulama1 değişkeni giriş yapma işleminin gerçekleşmesiyle alakalıdır. Giriş yapıldıysa 1 olur, yapılmadıysa 0 olur. dogrulama değişkenimiz ise kullanıcının Doğrulanmış veya Doğrulanmamış Kullanıcı türünün hangisinde olduğun belirler. Eğer 0'sa Kullanıcı Doğrulanmamıştır, Eğer 1 ise Kullanıcı Doğrulanmıştır. Ana page fonksiyonumuz dışında bu kodda 3 fonksiyonumuz var. Başta userpanel fonksiyonumuz var. Bu fonksiyon kullanıcı giriş yaptıktan sonraki arayüzü ayarlıyor, yani Column'dakileri falan ayarlıyor işte. emailt = Text(value=firebase.get(konum, 'email')) Kullandığımız bu kodun ne iş yaptığını söyleyeyim. Veri tabanımızın içindeki konum dizinindeki email adlı Key'e karşılık gelen değeri emailt adlı Text'e (Label'e) yazdırdık. firebase.get() ile kullandığımız kodlarda parantez içerisindeki 2. bölüm Key'i ifade eder. Eğer bir Key aratmak istemiyorsanız vb. benim 'email' yazdığım Key bölümüne '' yazabilirsiniz. Yani sadece içini boş bıraktık. Çift kesme işareti ('') veya çift tırnak işareti ("") kullanabilirsiniz. dogrulama değişkenini 0 ve 1'e göre koşullandırarak kullanıcının doğrulanma durumunu metin adlı değişkene kaydettik. Sonra t1 adlı Text'in (Label'in) değerini metin değişkeni olarak ayarladık. Bu işlemden sonra konum adlı değişkende kayıtlı olan konuma veri tabanımızda girdik ve içerisinde email Key'ine karşılık gelen değerin boş olup olmadığına baktık. Eğer boşsa E-Posta ekleyebilmesi için gerekli olan şeyleri col adlı Column'e aldık. Sayfayı page.update() ile güncelledik. Şimdi emailonayla2 fonksiyonumuza gelelim. Bu çok basit. Kullanıcının E-Posta adresini girdiği TextField'deki (TextBox'taki) metnin içerisinde @ işaretinin olup olmadığına bakıyor doğru bir E-Posta adresinin girilip girilmediğini anlamak için. Varsa konum adlı değişkende kayıtlı olan konuma E-Posta adresini ekliyor. onaylab1 fonksiyonumuzu ise daha önceki konumuzdan zaten biliyorsunuz. Evet, userpanel.py dosyamız da bu kadardı. Şimdi admin.py dosyamıza geçelim.
Python:
from firebase import firebase
import firebase_admin
import flet
from flet import Page, Text, ElevatedButton, TextField, Column
import os
from firebase_admin import credentials, db
cred = credentials.Certificate('serviceAccount.json')
firebase_admin.initialize_app(cred, {
'databaseURL': 'firebase_url'
})
isimliste = []
firebase = firebase.FirebaseApplication('firebase_url', None)
bilgisayar_adi = os.getlogin()
def adminsistem(page: Page):
result = firebase.get('/users/dogrulanmamis', None)
if result:
for key in result.keys():
isimliste.append(key)
print(key)
else:
print("No data found.")
page.title = "Admin Paneli"
dogrulanmamiskullanicilar = Text(value=isimliste)
page.update()
def onaylab1(e):
if username.value.strip() in firebase.get(f'admin/', ''):
if ((username.value.strip() == firebase.get(f'admin/{username.value.strip()}', 'username')) and
(int(password.value.strip()) == firebase.get(f'admin/{username.value.strip()}','password'))):
t1.value = f"Giriş Başarılı, Hoşgeldiniz {username.value.strip()}"
col.controls = [t1, dogrulanmamiskullanicilar, dogrulakullanici, dogrula]
else:
t1.value = "Kullanıcı Adı veya Şifre Hatalı!"
if username.value.strip() in firebase.get(f'users/dogrulanmis/', ''):
if (username.value.strip() == firebase.get(f'users/dogrulanmis/{username.value.strip()}', 'username')):
t1.value = f"Doğrulanmış Hesap. Lütfen Kullanıcı Paneli Üzerinden Giriş Yapınız."
else:
t1.value = "Kullanıcı Adı veya Şifre Hatalı!"
if username.value.strip() in firebase.get(f'users/dogrulanmamis/', ''):
if (username.value.strip() == firebase.get(f'users/dogrulanmamis/{username.value.strip()}','username')):
t1.value = f"Doğrulanmamış Hesap. Lütfen Kullanıcı Paneli Üzerinden Giriş Yapınız."
else:
t1.value = "Kullanıcı Adı veya Şifre Hatalı!"
page.update()
def kullanicidogrula2(e):
old_ref_path = f'users/dogrulanmamis/{dogrulakullanici.value.strip()}'
old_data = firebase.get(old_ref_path, None)
if old_data:
try:
firebase.put('/users/dogrulanmis', dogrulakullanici.value.strip(), old_data)
firebase.delete(old_ref_path, None)
t1.value = f'{username.value.strip()} | {dogrulakullanici.value.strip()} Adlı Kullanıcı Doğrulandı'
except Exception as e:
t1.value = f'{username.value.strip()} | Bir Şeyler Ters Gitti. Lütfen Tekrar Deneyiniz. Hata: {str(e)}'
else:
print("Veri bulunamadı.")
page.update()
username = TextField(label="Kullanıcı Adı", hint_text="Kullanıcı Adınızı Giriniz")
password = TextField(label="Şifre", hint_text="Şifrenizi Giriniz", password=True)
dogrulakullanici = TextField(label="Kullanıcı Adı", hint_text="Doğrulanacak Kullanıcı Adını Giriniz")
t1 = Text(value="")
dogrula = ElevatedButton(text="Kullanıcıyı Doğrula", on_click=kullanicidogrula2, width=page.width)
onaylab1 = ElevatedButton(text="Giriş Yap", on_click=onaylab1, width=page.width)
col = Column(controls=[username, password, t1, onaylab1], width=page.width, height=page.height, alignment="center", horizontal_alignment="center")
page.controls.append(col)
page.update()
flet.app(target=adminsistem)
Evet, admin.py dosyamızın kodu bu şekilde. Şimdi analize geçelim.
Başta yine kütüphanelerimizi import ederek, yani kodumuza aktararak başladık. Bu kodda diğerlerinden farklı olarak
cred adında bir değişken görüyorsunuz fakat bunu da güncel keylogger konumuzdan zaten biliyorsunuz. adminsistem adlı ana flet fonksiyonumuzda ilk önce result değişkenine bir veri tabanı konumunu kaydettik. Bu users/dogrulanmamis konumudur. Daha sonra key değişkenimizi sayaç olarak kullanıp bu konumun içerisinde döndürdük ve isimliste adlı listeye her seferinde gelen değeri kaydettik. onaylab1 fonksiyonumuz yine aynı, kullanıcının giriş yapmasını sağlıyor. kullanicidogrula2 fonksiyonumuzda ise Adminlerin Doğrulanmamış Kullanıcı türündeki kullanıcıları doğrulamasını sağlıyor. users/dogrulanmis konumunun içerisine dogrulakullanici.value.strip() adında bir klasör oluşturduk ve old_data adlı datamızı bu klasöre kopyaladık. Sonra kullanıcının users/dogrulanmamis dizinindeki klasörünü sildik çünkü artık o doğrulandı. Gerisini zaten biliyorsunuz, flet araçları falan.

Beni dinlediğiniz için teşekkür ederim, aklınıza takılan bir şey olursa DM'den veya bu konu altına sormaktan çekinmeyin. İyi Günler, İyi Forumlar!
(Kullandığım Analiz ve GitHub ayraçları @3326 hocama ait olup Bu Konudan kullabilirsiniz)






