0

我正在使用 Firebase、Pyrebase 和 Flask 构建一个快速注册页面;我设法创建了一个用户帐户并将数据推送到业务文件夹;我还创建了一个登录名,用户登录到个人资料页面 - 显示他们的姓名和他们的公司名称。

我唯一的问题是我无法提取单个数据,而是将数据显示为单个块;这让我很难找到一种businessName仅从userName.registerList

我还希望只显示已登录的用户的信息 - 我想我需要使用某种user[idToken]我不确定的类型。相反,我得到了整个列表(我知道使用 for 循环没有帮助!)

注册.py

    import pyrebase
    from flask import * 

    app = Flask(__name__)

    config = {
        "apiKey": "",
        "authDomain": "",
        "databaseURL": "",
        "projectId": "",
        "storageBucket": "",
        "messagingSenderId": "",
        "appId": "",
        "measurementId": ""
    }

    firebase = pyrebase.initialize_app(config)
    auth = firebase.auth()
    db = firebase.database()


    @app.route('/', methods=['GET', 'POST'])
    def login():
        unsuccessful = 'Please check your credentials'
        successful = 'Login successful'
        if request.method == 'POST':
            email = request.form.get('name')
            password = request.form.get('pass')
            try:
                user = auth.sign_in_with_email_and_password(email, password)
                register = db.child("Bame_Register").child("business").get()
                registerList = register.val()
                return render_template('profile.html', registerList=registerList)
            except:
                return render_template('new.html', us=unsuccessful)
        return render_template('new.html', us=unsuccessful)


    @app.route('/register', methods=['GET', 'POST'])
    def register():
        unsuccessful = 'Please check your credentials'
        successful = 'Registraion successful'
        if request.method == 'POST':
            email = request.form.get('email')
            password = request.form.get('pass')
            userName = request.form.get('inputName')
            businessName = request.form.get('businessName')
            try:
                user = auth.create_user_with_email_and_password(email, password)
                auth.send_email_verification(user['idToken'])
                bameRegister = dict(userName=userName, businessName=businessName)
                db.child("Bame_Register").child("business").push(bameRegister)
                return render_template('new.html', x=successful)
            except:
                return render_template('new.html', y=unsuccessful)
        return render_template('new.html')


    if __name__ == '__main__':
        app.run(debug=True)

新的.html

    <!DOCTYPE html>
    <html>
    <head>
      <title>Flask Firebase Auth</title>
      <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
      <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous">
      <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
    </head>
    <body>
      <div class="container">
        {% if s %}
          <div class="alert alert-success">
            <h2>{{s}}</h2>
          </div>
        {% endif %}

        {% if us %}
          <div class="alert alert-danger">
            <h2>{{us}}</h2>
          </div>
        {% endif %}

        <form action="/" method="post">
          <h2>Please sign in</h2>
          <label for="inputEmail">Email address</label>
          <input type="email" id="inputEmail" name="name"  placeholder="Email address" required autofocus>
          <label for="inputPassword">Password</label>
          <input type="password" id="inputPassword" name="pass"  placeholder="Password" required>
          <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
        </form>
      </div>
      <br>
      <div class="container">
        {% if x %}
          <div class="alert alert-success">
            <h2>{{x}}</h2>
          </div>
        {% endif %}

        {% if y %}
          <div class="alert alert-danger">
            <h2>{{y}}</h2>
          </div>
        {% endif %}

        <form action="{{ url_for('register') }}" method="post">
          <h2>Please create an account to register your business</h2>
          <label for="inputEmail">Email address</label>
          <input type="email" id="inputEmail" name="email"  placeholder="Email address" required autofocus>
          <label for="inputPassword">Password</label>
          <input type="password" id="inputPassword" name="pass"  placeholder="Password" required>
          <br>
          <label for="inputName">Enter your name: </label>
          <input type="text" id="inputName" name="inputName" placeholder="Name" required>
          <label for="businessName">Business Name</label>
          <input type="text" id="businessName" name="businessName" placeholder="Business Name" required>
          <button class="btn btn-lg btn-primary btn-block" type="submit">Register business</button>
        </form>
      </div>
    </body>
    </html>

profile.html

   <!DOCTYPE html>
   <html lang="en" dir="ltr">
     <head>
       <title>dynamic pages</title>
     </head>
     <body>
       {% for key,value in registerList.items() %}
         {% for data in value.values() %}
           <h4>{{ data }}</h4>
         {% endfor %}
       {% endfor %}
       <h6>Dynamic profile page</h6>
     </body>
   </html>

我将如何只显示用户的姓名或仅显示他们的公司名称?我在想也许data[userName]或者data[businessName],但那没有用!我希望能够单独获取数据,以便控制数据的显示位置。显示的数据应该只属于已登录的用户。然后我可以稍后添加用户可以编辑其信息的功能。

4

3 回答 3

0

在前面的评论的帮助下,我设法找到了一种在 Flask 网页上实现相同过程的方法。

@app.route('/', methods=['GET', 'POST'])
def login():
    unsuccessful = 'Please check your credentials'
    successful = 'Login successful'
    if request.method == 'POST':
        email = request.form.get('name')
        password = request.form.get('pass')
        try:
            user = auth.sign_in_with_email_and_password(email, password)
            registerList = db.child("Bame_Register").child("business").get(user['idToken']).val()
            data = registerList.get('-MBZJcfqbGhiOghMJEX5')
            usrNme = data['userName']
            bus = data['businessName']
            return render_template('profile.html', usrNme=usrNme, bus=bus)
        except:
            return render_template('new.html', us=unsuccessful)
    return render_template('new.html')

这行得通,但是我必须对用户注册业务时 Firebase 创建的自动生成的密钥进行硬编码。

如果有人可以帮助我以某种方式自动化data对象,这样我就不必写出每个键的名称,即'-MBZJcfqbGhiOghMJEX5'- 每次存储新注册时。

如果有一种方法可以自动化它,以便从变量访问密钥,该变量将被识别为'-MBZJcfqbGhiOghMJEX5'或创建任何其他新注册,它将允许我为所有注册创建一个模板 - 而不是在下面写出类似的东西对于创建的每个注册...

user['idToken']理想情况下,用户登录时显示的信息只有在按照建议使用时才属于他们自己的信息。

于 2020-07-07T22:51:42.067 回答
0

我遇到了同样的问题,但能够从上面@Akib 的答案和此处链接的另一篇文章中找到解决方法:从 OrderedDict 中提取数据

我将提供我的代码和我引用的其他代码的混合。

首先,按照上面@Akib 的步骤操作。为了方便起见,我会发布它们。

“在你的注册功能中试试这个:”

results = db.child("Bame_Register").child("business").push(bameRegister, user['idToken'])

“然后在你的登录功能中试试这个:”

registerlist = db.child("Bame_Register").child("business").get(user['idToken']).val()

就像他说的那样, print(registerlist) 的结果是:

('-MBVxA_L1VbTzjnRjpmf', {'businessName': 'BondRobotics', 'userName': 'Sinclair Akoto'})

现在,根据我试图从中获取特定值的错误,这是一个 OrderedDict 并且当我移至从 OrderedDict 中提取数据帖子时。我学到的是如何在 OrderedDict 中迭代列表。为此,首先在“registration.py”文件顶部导入 OrderedDict:

from collections import OrderedDict

最后,我们解析/迭代 OrderedDict。只有 If 语句是我添加的“为了只获取 userName 的数据”:

for val in bameRegister.values():
            for k,v in val.items():
                #print(k, v)
                if k == 'userName':
                    #print(v)
                    name = v
        print(name)

此 print(name) 将导致:

Sinclair Akoto

希望这可以帮助你!这是我的第一篇 stackoverflow 帖子,祝你好运!

于 2020-11-27T08:57:56.677 回答
0

在您的注册功能中试试这个:

#.push(bameRegister, user['idToken']) pushes your data with a uniquely identifiable key that is the user idToken
results = db.child("Bame_Register").child("business").push(bameRegister, user['idToken'])

然后在您的登录功能中试试这个:

registerlist = db.child("Bame_Register").child("business").get(user['idToken']).val()
print(registerlist)

进行上述更改后创建一个新用户,然后以该新用户身份登录。添加对新 print(registerlist) 为您提供的内容的评论。

让我知道它是否有效?!

希望上述查询更改的作用是在注册期间推送到 Firebase 之前创建一个唯一可识别的密钥。然后在登录期间查询该唯一键和该键的值将产生单个用户数据。

对我认为正在发生的事情的一点解释:

bameRegister = dict(userName=userName, businessName=businessName)
db.child("Bame_Register").child("business").push(bameRegister)

上面的代码来自您的注册函数。每次推送时,都会创建以下内容:

('-MBVxA_L1VbTzjnRjpmf', {'businessName': 'BondRobotics', 'userName': 'Sinclair Akoto'})

上面是一个键值对,其中键是'-MBVxA_L1VbTzjnRjpmf',值是{'businessName': 'BondRobotics', 'userName': 'Sinclair Akoto'}

密钥由firebase在推送时自动生成

来自 python conole 的有序 dict 的演示: 在此处输入图像描述

于 2020-07-06T02:18:43.467 回答