2015-06-15 4 views
0

Я создаю приложение в фляге, чтобы узнать python и sqlite3. Я столкнулся с проблемой: моя аутентификация входа в систему не проверяет записи в базе данных и позволяет каждому пользователю входить в систему. И данные пользователя хранятся в базе данных во время User signUp, поэтому база данных и таблицы не пусты. Я много пробовал, но не мог придумать никаких исправлений. Нужна помощь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

Вы должны исправить свой html-код: поместите двойные кавычки, если требуется. – doru

+0

@doru вы можете указать эти области для справки. – Cyclotron3x3

ответ

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() 
+0

c.execute ('SELECT * FROM users WHERE 1;'). что здесь «где 1»? – Cyclotron3x3

+0

ГДЕ 1 означает, что мы ничего не фильтруем. Запрос в моем ответе просто говорит sqlite для извлечения всего из таблицы под названием 'users' – Zyber

+0

Правильно ли это? если request.method == 'POST': \t \t имя пользователя = Request.Form [ 'имя пользователя'] \t \t пароль = Request.Form [ 'пароль'] \t \t дворняжка = g.db.execute ('выберите имя пользователя , пароль от пользователей, где имя пользователя = и пароль = '[имя пользователя, пароль]) \t \t g.db.commit() \t \t если cur.fetchone() является None: \t \t \t ошибка ='? Invalid логин.' \t \t еще: \t \t \t сессия [' logged_in '] = True \t \t \t обратный редирект (url_for (' привет ")) – Cyclotron3x3

0

Ваш HTML должно быть исправлено:

Атрибуты бывают пары имя/значение, как: имя = "значение"

source

Ваш 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

В какой момент я должен измениться. Я новичок в python. – Cyclotron3x3

+0

он все еще позволяет без аутентификации. Что-то не так с кодом sqlite или python? – Cyclotron3x3

+0

См. Ответ Зыбера, @ Cyclotron3x3. – Celeo

Смежные вопросы