@app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] # 查询用户是否存在 cur = mysql.connection.cursor() cur.execute("SELECT * FROM users WHERE username = %s", (username,)) user = cur.fetchone() cur.close() if user: columns = [column[0] for column in cur.description] user = dict(zip(columns, user)) if user['password'][0:-1] == password: session['username'] = username logging.info('Login success, redirect to home page.') return redirect(url_for('home')) else: return render_template('login.html', error='Incorrect Password') else: return render_template('login.html', error='User Not Found') else: return render_template('login.html')逻辑有误吗
时间: 2024-01-16 13:02:20 浏览: 83
这段代码的逻辑没有明显的问题。这是一个 Flask 应用程序中的登录视图函数,它接受 GET 和 POST 请求。如果请求方法是 POST,则从表单中获取用户名和密码,然后在数据库中查询该用户是否存在。如果存在,则比较密码,如果匹配,则将用户名存储在会话中,并重定向到主页。如果密码不匹配,则返回登录页面,并显示密码错误的消息。如果用户不存在,则返回登录页面,并显示用户未找到的消息。如果请求方法是 GET,则返回登录页面。
但是,需要注意的是,在比较密码时,代码使用了 `user['password'][0:-1]` 的方式来去掉密码字符串末尾的换行符。这种方式不一定可靠,因为密码可能包含任何字符,不一定以换行符结尾。建议使用其他方式来去掉换行符,比如 `password.strip()`。
相关问题
优化这段代码,要求在login.html登录验证成功后,跳转到index.html: @app.route('/') def index(): data = SourceData() if 'username' not in session: return redirect(url_for('login')) else: return render_template('login.html', form=data, title=data.title) @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': username = request.form.get('username') password = request.form.get('password') # 查询数据库检查用户名和密码是否匹配 query = "SELECT * FROM users WHERE username=%s AND password=%s" values = (username, password) cursor.execute(query, values) user = cursor.fetchone() if user: session['username'] = user[1] return redirect(url_for('index')) else: return render_template('login.html', error='用户名或密码错误') else: return render_template('login.html')
您的代码已经是一个良好的起点,但有一些可以进行优化的地方。下面是对您提供的代码进行优化的建议:
1. 使用密码哈希:在数据库中存储密码的哈希值而不是明文密码,可以提高安全性。
2. 使用表单验证:在服务器端进行用户名和密码的验证,而不是直接执行SQL查询。
3. 使用`flash`消息:使用`flash`消息来向用户显示错误信息,而不是将错误信息作为参数传递给模板。
4. 重命名路由:将路由函数的名称更改为更具描述性和一致性的名称。
下面是优化后的代码示例:
```python
from flask import Flask, render_template, request, redirect, url_for, session, flash
from werkzeug.security import check_password_hash
app = Flask(__name__)
app.secret_key = 'your_secret_key'
@app.route('/')
def home():
if 'username' not in session:
return redirect(url_for('login'))
else:
return redirect(url_for('index'))
@app.route('/index')
def index():
return render_template('index.html')
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form.get('username')
password = request.form.get('password')
# 查询数据库检查用户名和密码是否匹配
query = "SELECT * FROM users WHERE username=%s"
values = (username,)
cursor.execute(query, values)
user = cursor.fetchone()
if user and check_password_hash(user['password'], password):
session['username'] = user['username']
flash('登录成功', 'success')
return redirect(url_for('index'))
else:
flash('用户名或密码错误', 'error')
return redirect(url_for('login'))
else:
return render_template('login.html')
if __name__ == '__main__':
app.run()
```
注意,上述代码假设您已经在数据库中存储了用户的密码哈希值,并且已经配置了数据库连接。请根据您的实际情况进行相应的修改。此外,还需要根据您的实际需求来调整`index.html`和`login.html`模板文件。
# 登录页面 @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] # 查询用户是否存在 cur = mysql.connection.cursor() cur.execute("SELECT * FROM users WHERE username = %s", (username,)) user = cur.fetchone() cur.close() if user: if user['password'][0:-1] == password: session['username'] = username return redirect(url_for('home')) else: return render_template('login.html', error='Incorrect Password') else: return render_template('login.html', error='User Not Found') else: return render_template('login.html')这段代码报错tuple indices must be integers or slices, not str
这个错误通常发生在尝试使用字符串索引访问元组中的元素时。在上述代码中,出现此错误的可能原因是在获取用户数据后,使用了字典的方式访问元组中的元素。元组是不可变的,因此无法通过字典方式访问元素。
为了解决这个错误,可以将获取到的元组转换为字典,然后再使用字典方式访问元素。可以使用 cursor 对象获取字段名(例如,使用 `cursor.description`),并将其与元组中的值一起转换为字典。下面是修改后的代码:
```
# 查询用户是否存在
cur = mysql.connection.cursor()
cur.execute("SELECT * FROM users WHERE username = %s", (username,))
user_data = cur.fetchone()
cur.close()
if user_data:
columns = [column[0] for column in cur.description]
user = dict(zip(columns, user_data))
if user['password'][0:-1] == password:
session['username'] = username
return redirect(url_for('home'))
else:
return render_template('login.html', error='Incorrect Password')
else:
return render_template('login.html', error='User Not Found')
```
注意,在使用完 cursor 对象后,应该及时关闭连接以释放资源。
阅读全文