我在flask中创建一个应用程序来学习python和sqlite3。我面临的问题是我的登录验证不检查数据库条目并允许每个用户登录。用户登录时用户数据已存储在数据库中,因此数据库和表格不为空。我已经尝试了很多,但无法解决任何问题。需要一些帮助
这是必需的代码段。 问题出在' / login'块。
app.py
def connect_db():
return sqlite3.connect(DATABASE)
def init_db():
with closing(connect_db()) as db:
with app.open_resource('schema.sql', mode='r') as f:
db.cursor().executescript(f.read())
db.commit()
@app.before_request
def before_request():
g.db = connect_db()
@app.teardown_request
def teardown_request(exception):
db = getattr(g, 'db', None)
if db is not None:
db.close()
@app.route('/login', methods=['GET', 'POST'])
def login():
error = None
#show = 10
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
cur = g.db.execute('select username,password from users where
username=? AND password=? ',[username,password])
g.db.commit()
if cur is None:
error = 'No such user'
else:
session['logged_in'] = True
flash('You are logged in')
return redirect(url_for('show_entries'))
# return ;
return render_template('login.html', error=error)
的login.html
{% extends "layout.html" %}
{% block body %}
<h2>Login</h2>
{% if error %}<p class=error><strong>Error:</strong> {{ error }}{% endif %}
<form action="{{ url_for('login') }}" method=post>
<dl>
<dt>Username:
<dd><input id="name" type=text name=username>
<dt>Password:
<dd><input id="pass" type=password name=password>
<dd><input id="login" type=submit value=Login>
</dl>
</form>
{% endblock %}
答案 0 :(得分:1)
cur = g.db.execute
将返回一个游标对象,这将永远不会是None
。
相反,您应检查是否有任何结果行。
if cur.fetchone() is None:
但您应该查看文档以了解如何在sqlite中执行查询:https://docs.python.org/2/library/sqlite3.html
更合适的方法是创建连接,然后创建游标。然后在光标上执行查询。
import sqlite3
conn = sqlite3.connect('example.db')
c = conn.cursor()
c.execute('SELECT * FROM users WHERE 1;')
print c.fetchone()
答案 1 :(得分:0)
您的HTML需要修复:
属性来自名称/值对,例如:name =&#34; value&#34;
您的Login.html将如下所示:
{% extends "layout.html" %}
{% block body %}
<h2>Login</h2>
{% if error %}<p class="error"><strong>Error:</strong> {{ error }}{% endif %}
<form action="{{ url_for('login') }}" method="post">
<dl>
<dt>Username:
<dd><input id="name" type="text" name="username">
<dt>Password:
<dd><input id="pass" type="password" name="password">
<dd><input id="login" type="submit" value="Login">
</dl>
</form>
{% endblock %}