【问题标题】:TypeError: coercing to Unicode: need string or buffer, sqlite3.Cursor foundTypeError: coercing to Unicode: need string or buffer, sqlite3.Cursor found
【发布时间】:2018-05-19 19:50:22
【问题描述】:

我正在使用 Flask 和 SQLite 作为数据库构建 Python Web 应用程序。

当我尝试登录并验证数据库中的用户信息时,出现上述错误。我的其他数据库表单输入工作,我能够更新和选择数据,因此数据库存在并且连接在应用程序的某些部分工作。登录脚本似乎是问题所在。

@app.route('/login', methods=['POST', 'GET'])
def do_admin_login():
if request.method == "POST":
u_stmt="SELECT CASE WHEN '"+ request.form['username'] +"' IN (SELECT uname 
FROM logins) THEN 1 ELSE 0 END"  #uname in logins
p_stmt="SELECT pword FROM logins WHERE uname = '"+request.form['username']+"'"  
# retrieve pwd of uname
s_stmt="SELECT salt FROM logins WHERE uname = '"+request.form['username']+"'"  
# retrieve salt of uname
print u_stmt
print p_stmt
print s_stmt
with sql.connect("database.db") as con:
  cur = con.cursor()
  pwd = cur.execute(p_stmt)
  uname = cur.execute(u_stmt)
  salt = cur.execute(s_stmt)
  print uname
  print pwd
  print salt
  con.commit()
con.close()

hashed_password = hash_password(request.form['password'], salt)
if hashed_password == pwd and uname == 1:
    session['logged_in'] = True     
    flash('right password!')
    return render_template('home.html')
else:
    flash('wrong password!')
return home()
else:
return render_template('login.html')

这是我 login.html 中的代码

<form action="/login" method="POST">
<div class="login">
    <div class="login-screen">
        <div class="app-title">
            <h1>Login</h1>
        </div>

        <div class="login-form">
            <div class="control-group">
            <input type="text" class="login-field" value="" placeholder="username" name="username">
            <label class="login-field-icon fui-user" for="login-name"></label>
            </div>

            <div class="control-group">
            <input type="password" class="login-field" value="" placeholder="password" name="password">
            <label class="login-field-icon fui-lock" for="login-pass"></label>
            </div>

            <button type="submit" class="btn btn-primary btn-large btn-block">Log in</button>
            <br><br>
            <a href="signup" class="btn btn-primary btn-large btn-block">Sign up</a>
            <br><br>
        </div>
    </div>
</div>

Stacktrace (methinks)

非常感谢任何帮助。谢谢!

def hash_password(password, salt):
"""
Take a password and a salt, and return a hashed password
"""
password_string = (password + salt).encode('utf-8')
hashed_password = hashlib.sha512(password_string).hexdigest()
return hashed_password


def get_auth_for_user(user_id):
"""
Take a user_id, and return what we know about that user
"""
db_cursor.execute("SELECT * FROM user WHERE id=" + user_id)
result = db_cursor.fetchone()
return result

Traceback with SQL output

【问题讨论】:

  • 你能添加错误的整个堆栈跟踪吗?
  • 已添加,如有其他需要请告诉我
  • 执行后有没有获取到查询?请包含引发异常的代码(第 13 行)和脚本的输出
  • 我添加了引发异常的哈希函数,并附上了第二张包含 SQL 输出的回溯照片

标签: python sqlite flask


【解决方案1】:

这里的主要问题是您试图将 sqlite3.Cursor 对象强制转换为 unicode。

salt = cur.execute(s_stmt) 语句返回一个sqlite3.Cursor 对象(请注意,print salt 语句的输出在您的日志中为&lt;sqlite3.Cursor object at 0x1048e1500&gt;)。

改变这一行: salt = cur.execute(s_stmt)

对此: salt_query = curs.execute(s_stmt) salt = curs.fetchone()[0]

最后一行从表中获取结果,并获取第一列的值。该值将是一个字符串而不是 SQLite 游标。

【讨论】:

    猜你喜欢
    • 2015-03-21
    • 2021-08-05
    • 2021-10-10
    • 2015-08-20
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    相关资源
    最近更新 更多