【问题标题】:Python/Flask - Comparing user input to database valuePython/Flask - 将用户输入与数据库值进行比较
【发布时间】:2020-06-03 18:57:53
【问题描述】:

我在这里尝试使用 Python 和 Flask 边做边学,但遇到了一些我不太理解的事情 - 希望那里的人能够帮助或解释这种行为。

我没有构建任何真实的东西,只是想学习和理解这里发生了什么。

我正在使用 Python/Flask 中的注册/登录表单,正在为登录部分苦苦挣扎。

我已经建立了一个注册,其中将姓名、电子邮件和密码(未经过哈希处理,稍后会出现)写入一个简单的表“用户”,并带有 |身份证 |姓名 |电子邮件 |密码 |结构,所有值都是 varchar,除了 ID 是 INT 和自动增量。

我的进口是

import os
from flask import Flask, session, request
from flask_session import Session
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from flask import Flask, render_template
app = Flask(__name__)

# Set up database
engine = create_engine(os.getenv("DATABASE_URL"))
db = scoped_session(sessionmaker(bind=engine))

我有一个如下所示的 html 登录表单

<form action="{{ url_for('login') }}" method="post">
    <div class="form-group">
      <label for="email">E-mail:</label>
      <input type="email" name="email" class="form-control" placeholder="Enter email">
    </div>
    <div class="form-group">
      <label for="pwd">Password:</label>
      <input type="password" name="pwd" class="form-control" placeholder="Enter password">
    </div>
    <button type="submit" class="btn btn-primary">Login</button>
</form>
<p> {{ logintry }}

我的'login'的Flask申请路径如下

@app.route("/login", methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        uname = request.form.get("email")
        passwd = request.form.get("pwd")
        pwCheck = db.execute("SELECT password FROM users WHERE email = :uname", {"uname": uname}).fetchone()

        if pwCheck == passwd:
            return render_template("authenticated.html")
        else:
            return render_template("login.html", logintry="Login Failure")
    else:
        return render_template("login.html")

在此示例中,我尝试使用 test@test.com 电子邮件登录,密码为 1234

我遇到的问题是数据库值似乎返回为

('1234',)

而用户输入只是简单地呈现为

1234

因此它们不相等,登录失败。

谁能在这里帮助指导我,或者解释一下发生了什么?

提前致谢。

【问题讨论】:

  • 调用数据库值后能显示是什么类型吗?类型(数据库值)
  • 为什么你不能简单地做if pwCheck and pwCheck[1] == passwd:

标签: python sql flask


【解决方案1】:

这里有两点需要了解: 1. 数据库返回什么 2. 你的表单返回了什么

为了了解如何让登录起作用,您必须了解如何确保您的表单和数据库给您的输入/结果可以进行比较。

在您的问题中,您说数据库正在返回 ('1234',)。这是python中的一个元组,可以被索引。像这样索引你的元组

pwCheck[0]

将返回“1234”。

因此,与其比较数据库查询返回的原始结果,不如了解您的数据库返回的数据在与表单输入进行比较之前需要进行更多处理。

你可以添加一个额外的行来创建一个新的变量 db_pwd,像这样

db_pwd = pwCheck[0]

然后检查是否 db_pwd == passwd

【讨论】:

  • 你好丹尼尔。感谢您的回答。我明白你的意思,这很有意义。谢谢你的解释
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
相关资源
最近更新 更多