我已经使用工厂初始化了MyFirebase模块,但是现在我仍然无法从ProfileWindow类访问MyFirebase模块中的实例。任何可以在代码中通知问题的人。我正在尝试从MyFirebase模块访问localId实例。经过数小时的尝试解决问题后,我无法发现它。如果有任何帮助,我将不胜感激
from kivy.app import App
import requests
import json
from kivy.factory import Factory
from kivy.properties import ObjectProperty
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.lang import Builder
from kivy.clock import Clock
class MyFireBase(object):
def __init__(self):
self.localId = None
self.sign_up_request = None
def sign_up(self, email, password):
app = App.get_running_app()
email = email.replace("\n","")
password = password.replace("\n","")
# Send email and password to Firebase
# Firebase will return localId, authToken (idToken), refreshToken
signup_url = "https://www.googleapis.com/identitytoolkit/v3/relyingparty/signupNewUser?key=" + self.wak
signup_payload = {"email": email, "password": password, "returnSecureToken": True}
self.sign_up_request = requests.post(signup_url, data=signup_payload)
sign_up_data = json.loads(self.sign_up_request.content.decode())
print(self.sign_up_request.ok)
print(self.sign_up_request.content.decode())
if self.sign_up_request.ok == True:
print(sign_up_data)
refresh_token = sign_up_data['refreshToken']
self.localId = sign_up_data['localId']
idToken = sign_up_data['idToken']
# Save refreshToken to a file
with open(app.refresh_token_file, "w") as f:
f.write(refresh_token)
app.local_id = self.localId
app.id_token = idToken
my_data = '{"avatar": "profilepic.png", "jobs_done": "", "jobs_posted": ""}'
post_request = requests.patch("https://moonlighting-bb8ab.firebaseio.com/users/" + self.localId + ".json?auth=" + idToken, data=my_data)
print(post_request.ok)
print(post_request.content.decode())
app.root.current = "create"
elif self.sign_up_request.ok == False:
error_data = json.loads(self.sign_up_request.content.decode())
error_message = error_data["error"]['message']
app.root.ids.signup.ids.signup_message.text = error_message.replace("_", " ")
def send_user_details(self):
app = App.get_running_app()
my_data ={"first name": app.root.ids.create.ids.first_name.text, "last name": app.root.ids.create.ids.last_name.text,
"phone number": app.root.ids.create.ids.phone_number.text, "job1": app.root.ids.create.ids.job1.text, "job2": app.root.ids.create.ids.job2.text,
"job3": app.root.ids.create.ids.job3.text, "date of birth": app.root.ids.create.ids.date_of_birth.text, "state": app.root.ids.create.ids.state1.text}
user_details = requests.patch("https://moonlighting-bb8ab.firebaseio.com/users/" + app.local_id + ".json?auth=" + app.id_token, json.dumps(my_data))
print(user_details.ok)
print(user_details.content.decode())
app.root.current = "main"
def sign_in_existing_user(self, email, password):
signin_url = "https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPassword?key=" + self.wak
signin_payload = {"email": email, "password": password, "returnSecureToken": True}
signin_request = requests.post(signin_url, data=signin_payload)
sign_up_data = json.loads(signin_request.content.decode())
app = App.get_running_app()
print(signin_request.ok)
print(signin_request.content.decode())
if signin_request.ok == True:
refresh_token = sign_up_data['refreshToken']
self.localId = sign_up_data['localId']
idToken = sign_up_data['idToken']
# Save refreshToken to a file
with open(app.refresh_token_file, "w") as f:
f.write(refresh_token)
app.root.current = "main"
elif signin_request.ok == False:
error_data = json.loads(signin_request.content.decode())
error_message = error_data["error"]['message']
app.root.ids.login.ids.login_message.text = error_message.replace("_", " ")
#thefirebase = MyFireBase() # not needed
Factory.register('MyFireBase', cls=MyFireBase) # register MyFireBase so that it is available in kv
class ProfileWindow(Screen):
thefirebase = ObjectProperty(None)
def __init__(self, **kwargs):
self.thefirebase = kwargs.pop('firebase', None) # use kwargs to pass the firebase to eliminate the required positional arg
super(ProfileWindow, self).__init__(**kwargs)
#self.thefirebase = thefirebase # not needed
def print(self):
print(self.thefirebase.localId)
class MyApp(App):
refresh_token_file = "refresh_token.txt"
members_list = "members_list.txt"
def build(self):
self.refresh_token_file = self.user_data_dir + self.refresh_token_file
return sm
class WindowManager(ScreenManager):
pass
sm = Builder.load_file("kivy.kv")
#sm = WindowManager() # not needed, sm is built by the `kv` file
# sm.current = "page" # not needed, it is the default
if __name__ == '__main__':
MyApp().run()
kivy.kv:
#:import Factory kivy.factory.Factory
WindowManager:
id: window manager
ProfileWindow:
id: page
name: "page"
thefirebase: Factory.MyFireBase() # this builds thefirebase
Button:
text: 'ProfileWindow' # just so the ProfileWindow has something to display
on_release: page.print()
任何帮助将不胜感激,谢谢