Python中Firebase Admin SDK读取数据库异常,如何解决?
问题:无法读取Firebase实时数据库中的用户密码
使用db.reference('credentials/login/' + logged_username)无法获取到用户密码,打印该变量得到的是<firebase_admin.db.Reference object at 0x103a7d190>而非预期的密码值,代码如下:
import firebase_admin from firebase_admin import credentials from firebase_admin import db cred = credentials.Certificate('ServKey.json') logged = input("are you logged in (True / False)") firebase_admin.initialize_app(cred, { 'databaseURL' : 'https://chatat-73f4a-default-rtdb.europe-west1.firebasedatabase.app/' }) ref = db.reference('credentials/') if logged == "False" : register_username = input("What do you want your username to be ? ") register_password = input("What do you want your password to be ? ") login_ref = ref.child('login') def setlogin() : login_ref.set({ register_username : { 'Password' : register_password, } }) if logged == "False": setlogin() print("ouisir") if logged == "True" : logged_username = input("What is your username ? ") logged_password = input("What is your password ? ") check_password = db.reference('credentials/login/' + logged_username) if check_password == logged_password : logged_in = True print(check_password)
问题原因与修复方案
核心问题
db.reference()仅返回数据库节点的引用对象,不会自动获取数据,必须调用.get()方法才能读取对应节点的实际内容。此外代码还存在作用域和数据结构处理的问题。
具体修复步骤
- 读取数据需调用
.get():db.reference()只是指向节点的指针,要拿到数据必须调用.get(),同时要根据存储的字典结构提取Password字段。 - 修正变量作用域:将密码验证逻辑缩进在
logged == "True"分支内,避免未进入登录流程时check_password未定义导致报错。 - 处理空数据情况:如果查询的用户名不存在,
.get()会返回None,需提前判空防止后续报错。
修复后的完整代码
import firebase_admin from firebase_admin import credentials from firebase_admin import db cred = credentials.Certificate('ServKey.json') logged = input("are you logged in (True / False)") firebase_admin.initialize_app(cred, { 'databaseURL' : 'https://chatat-73f4a-default-rtdb.europe-west1.firebasedatabase.app/' }) ref = db.reference('credentials/') if logged == "False" : register_username = input("What do you want your username to be ? ") register_password = input("What do you want your password to be ? ") login_ref = ref.child('login') def setlogin() : login_ref.set({ register_username : { 'Password' : register_password, } }) if logged == "False": setlogin() print("ouisir") if logged == "True" : logged_username = input("What is your username ? ") logged_password = input("What is your password ? ") # 获取用户数据并提取密码字段 user_data = db.reference('credentials/login/' + logged_username).get() check_password = user_data.get('Password') if user_data else None if check_password == logged_password : logged_in = True print("登录成功") else: print("用户名或密码错误") print(check_password)
内容的提问来源于stack exchange,提问作者Emilio Zetoxx
相关产品推荐
相关产品推荐

