Python Flask POST/GET请求

3
我可以帮助您翻译关于IT技术的内容,以下是需要翻译的文字:

我需要在我的网站上进行用户认证。我正在使用Python Flask,SQLite3和DB Browser for SQLite。我在登录部分遇到了麻烦。每次我尝试登录并重定向到一个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')

1
请再检查一下你的逻辑。你正在将用户名和密码的值与它们自己进行比较。 - Daniel Roseman
@DanielRoseman 但我是从POST请求中检查用户名和密码,然后将其与数据库中的用户名和密码进行比较。这不是您的做法吗? - KatomPower
1
你不是这样做的。你认为自己在哪里做这个?你从request.form中获取用户名,然后直接将其与request.form['username']即本身进行比较。 - Daniel Roseman
@DanielRoseman 好的,我现在明白了。那么我该如何检查数据库中的登录凭据是否正确? - KatomPower
2个回答

1

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


登录应该检查用户名和密码是否在数据库中。我知道我做错了,所以我的问题是如何做到呢? - KatomPower

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'

作为丹尼尔·罗斯曼所解释的那样,这种逻辑是错误的。你需要做的是将用户提供的“密码”与你在数据库中存储的密码进行比较。
在伪代码中,它看起来像这样:
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)

这只是最低要求,当然你可以对此进行改进。

谢谢你的帮助。它可能会起作用,但我不想只是复制它,我想用自己的方式来做。我将发布新代码,但不幸的是它给了我一个错误。 - KatomPower

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接