【问题标题】:Python Flask POST/GET requestPython Flask POST/GET 请求
【发布时间】:2017-05-22 19:44:24
【问题描述】:

我需要有关网站中用户身份验证的帮助。我正在为 SQLite 使用 python flask、sqlite3 和 DB Browser。我在登录部分遇到问题。每次我尝试登录并重定向到 html 网站时,它都会显示错误 404。

这是登录页面的代码:

<!DOCTYPE html>
<html>
  <head>
    <meta charset = "UTF-8"/>
    <title>PackageDrop Login</title>
    <link type = "text/css" rel = "stylesheet" href="{{ url_for('static', filename='login.css') }}" />
    <link type = "text/css" rel = "stylesheet" href="{{ url_for('static', filename='cssmainpage.css') }}" />
  </head>
  <body>
    <form action="/login" method="POST" autocomplete="off">
    Username:<br>
    <input type="text" name="username">
    <br>
    Password:<br>
    <input type="password" name="password">
    <br><br>
    <input type="submit" value="Login">
    </body>
</html>

转发到的页面只是简单的html,没什么特别的,所以我不上传了。 如果您觉得需要更多信息来理解,请询问,我会尽快发布。 感谢我得到的所有帮助。

编辑1: 在 login.html 中将表单操作从“login.html”更改为“login”,现在它给出了 400 Bad Request 错误。

编辑2: 重定向有效。我已经更改了登录代码,但它产生了这个错误:“ProgrammingError:在线程中创建的 SQLite 对象只能在同一个线程中使用。该对象是在线程 id 7812 中创建的,这是线程 id 7388”。我唯一做的就是像这样连接到数据库: conn = sqlite3.connect('database.db') 这是登录的新代码:

@app.route('/login', methods=['GET', 'POST'])
def login():
    error = None
    checkP = conn.execute('select pword from users where uname = request.form[\'username\']')
    arrayCheck = checkP.fetchall()
    if request.method == 'POST':
        if request.form['password'] != arrayCheck[[0][0]]:
            error = 'Incorrect password'
            return redirect(url_for('login.html'))
        elif len(arrayCheck) == 0:
            error = 'Username or password is incorrect'
            return redirect(url_for('login.html'))
        else:
            session['logged_in'] = True
            flash('You are logged in')
            return redirect(url_for("userpage"))
    return render_template('login.html')

【问题讨论】:

  • 再看看你的逻辑。您正在将用户名和密码值与自己进行比较。
  • @DanielRoseman 但我正在检查发布请求中的用户名和密码,然后将其与数据库中的用户名和密码进行比较。这不是你的做法吗?
  • 不,你不是。你认为你在哪里这样做?你从request.form得到用户名,然后直接和request.form['username']比较,即自己。
  • @DanielRoseman 好的,我现在明白了。那么如何检查数据库的登录凭据是否正确?

标签: python html sqlite flask


【解决方案1】:
username = request.form['uname']
password = request.form['pword']
if request.form['uname'] != username:
    error = 'Incorrect username'
if request.form['pword'] != password:
    error = 'Incorrect password'

正如 Daniel Roseman 解释的那样,这种逻辑是有缺陷的。您需要做的是将用户提供的password 与您存储在数据库中的密码进行比较。

在伪代码中,它看起来像这样:

username = request.form['uname']
password = request.form['pword']
try:
    db_password = my_db.get('uname')
    if password == db_password:
        session['logged_in'] = True
    else: 
        error = "Password provided does not match Database"
except Exception as exc:
    error = "Could not obtain password from Database : {}".format(exc)

这只是最低限度,当然您可以对此进行改进。

【讨论】:

  • 感谢您的帮助。它可能会起作用,但我不只是想复制它,我想以我的方式去做。我将发布不幸给我错误的新代码。
【解决方案2】:

http 404 代码表示page not found。当您发布表单时,您的重定向是到userpage.html,但您的表单操作是到/login 路由。您的操作应该是成功发布后重定向的目标页面action="/userpage" 我假设您有userpage 视图功能。或者您可以将操作留空,只需尝试使用重定向功能redirect(url_for('userpage'))。注意url_for() 函数采用视图函数名称而不是模板名称。最后一件事我没有注意您的登录逻辑。

【讨论】:

  • 登录应该检查用户名和密码是否在数据库中。我知道我没有做对,所以我的问题是我该怎么做?
猜你喜欢
  • 2016-11-14
  • 2020-08-28
  • 1970-01-01
  • 2018-07-05
  • 2014-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-10
相关资源
最近更新 更多