我的网站需要有关用户身份验证的帮助。我正在使用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,没什么特别的,所以我没有上传它。 如果您觉得需要了解更多信息,请询问,我会尽快发布。 感谢我得到的所有帮助。
EDIT1: 在login.html中将表单操作从“login.html”更改为“login”,现在它提供了400 Bad Request错误。
EDIT2: 重定向有效。我已经更改了登录的代码但它出现了这个错误:“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')
答案 0 :(得分:1)
Http 404
代码表示page not found
。当您发布表单时,您的重定向到userpage.html
,但您的表单操作是/login
路由。您的操作应该是成功发布后重定向的目标页面action="/userpage"
我假设您有userpage
查看功能。或者您可以将操作留空,只需尝试使用重定向功能redirect(url_for('userpage'))
。注意url_for()
函数采用视图函数名称而不是模板名称。最后一件事我没注意你的登录逻辑。
答案 1 :(得分: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'
丹尼尔罗斯曼解释说这种逻辑是有缺陷的。您需要做的是将用户提供的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)
这只是最小的,当然你可以改进这一点。