python - 为什么我总是得到一个盲参数错误?
问题描述
问题:
每当我尝试从 UI 注册用户时,都会收到错误消息。这个想法是提交表单并将数据输入 python 并运行 INSERT 查询,以便将其添加到数据库以允许登录。
样本输入:
姓名:基龙
密码(散列):pbkdf2:sha256:150000$aQfm996V$af032bc39170c1e2b59cab53691ebb48e50d3824b851de6921c56f07f4a10d3c
电子邮件:Kieron@example.com
错误信息:
> sqlalchemy.exc.StatementError: (sqlalchemy.exc.InvalidRequestError) A
> value is required for bind parameter 'password'
>[SQL: INSERT INTO
> users (name, password, email) VALUES(%(user)s, %(password)s,
> %(email)s)] [parameters: [{'user': 'Kieron', ':password':
> 'pbkdf2:sha256:150000$aQfm996V$af032bc39170c1e2b59cab53691ebb48e50d3824b851de6921c56f07f4a10d3c',
> 'email': 'kieron@example.com'}]]
数据库连接:
该数据库在不使用 ORM 的情况下与 sqlalchemy 引擎绑定连接,目的是了解更多关于在不使用 ORM 的情况下执行此操作的信息,应用程序配置如下:
app = Flask(__name__)
app.config['DATABASE_URL']="url to db"
# Check for environment variable
if not os.getenv("DATABASE_URL"):
raise RuntimeError("DATABASE_URL is not set")
# Configure session to use filesystem
app.config["SESSION_PERMANENT"] = False
app.config["SESSION_TYPE"] = "filesystem"
Session(app)
# Set up database
engine = create_engine(os.getenv("DATABASE_URL"))
db = scoped_session(sessionmaker(bind=engine))
与问题相关的代码:
我相信以下路线是问题的根源,我不太确定我在哪里出错了。整个路线的想法是:
清除以前的会话并从表格中获取详细信息。
针对数据库运行表单条目以确保唯一的条目。
创建密码哈希并输入到数据库中。
@app.route("/register", methods=['POST','GET'])
def register():
session.clear()
if request.method == 'POST':
#check for empty fields
if not request.form.get("name"):
return apology("must provide username", 403)
elif not request.form.get("password"):
return apology("must provide password", 403)
elif not request.form.get("email"):
return apology("must provide email", 403)
#get variables from form
user = request.form.get("name")
password = request.form.get("password")
email = request.form.get("email")
#hash password
passwordHash = generate_password_hash(password, method='pbkdf2:sha256', salt_length=8)
#check email and username don't exist
if db.execute("SELECT name FROM users WHERE name = :user", {"user": user}).rowcount != 0:
return apology("Username already taken", 403)
elif db.execute("SELECT email FROM users WHERE email = :email", {"email": email}).rowcount != 0:
return apology("Email already has an account in system",403)
#add to db
db.execute("INSERT INTO users (name, password, email) VALUES(:user, :password, :email)", {"user":user, "password":passwordHash, "email":email})
db.commit()
return redirect("/login")
return render_template("register.html")
问题总结:
我相信错误来自 INSERT 查询,但我不确定在哪里。
我哪里出错了,我怎样才能使它正常工作?
解决方案
您在要插入的值中有错字。
当前代码{"user":user, ":password":passwordHash, "email":email}
虽然应该是(之前 {"user":user, "password":passwordHash, "email":email}
删除):
password
推荐阅读
- javascript - 防止文本区域出现特殊字符
- python - lark-parser 缩进 DSL 和多行文档字符串
- c# - 修复了 Windows 窗体应用程序中 TextBox 内的文本(或标签)
- python - Shell 命令在 python 3 上卡住,但在 python 2 上工作
- php - 通过 Wordpress RSS 源显示过去 7 天查看次数最多的帖子
- excel - VBA - 将数字的所有排列写入数组
- python - Python:嵌套尝试捕获处理
- oracle - 检查 Oracle 报告中未使用的查询
- node.js - 如何使用 moment.js 生成日期对象
- ios-simulator - 获取“无法启动新会话。可能的原因是远程服务器地址无效pr浏览器启动失败”