在使用工厂进行初始化之后,我无法访问已初始化类的实例

时间:2020-01-21 12:58:50

标签: python kivy

我已经使用工厂初始化了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()

任何帮助将不胜感激,谢谢

0 个答案:

没有答案