Python 为什么调用flask会话时会出现密钥错误?
我遇到了一个问题,用户试图注册我的应用程序(这是一个使用MongoDB Atlas部署在Pythonywhere上的Flask应用程序) 基本上,当他们注册时,他们会收到一封带有令牌的电子邮件,需要点击确认。当他们点击这个链接时,他们应该进入应用程序,但是他们收到了一个错误 当我检查错误日志时,当它调用时,我看到的是(在“/auth/register”下):Python 为什么调用flask会话时会出现密钥错误?,python,session,flask,keyerror,Python,Session,Flask,Keyerror,我遇到了一个问题,用户试图注册我的应用程序(这是一个使用MongoDB Atlas部署在Pythonywhere上的Flask应用程序) 基本上,当他们注册时,他们会收到一封带有令牌的电子邮件,需要点击确认。当他们点击这个链接时,他们应该进入应用程序,但是他们收到了一个错误 当我检查错误日志时,当它调用时,我看到的是(在“/auth/register”下): existing_user=user。通过电子邮件获取(会话[“email”]) 返回super(SecureCookieSession,
existing_user=user。通过电子邮件获取(会话[“email”])
返回super(SecureCookieSession,self)。\uu获取项目\uuuu(键)
异常keyrerror:“电子邮件”
被抛出
似乎会话[“email”]
不起作用
这是我的代码:
@app.route(“/confirm/”)
def确认电子邮件(令牌):
尝试:
email=ts.loads(token,salt=“email confirm key”,max_age=7200)
除:
返回呈现模板(“token\u expired.html”)
user=Database.find_one(collection=“users”,query={“email”:email})
返回重定向(url\u用于(“注册用户”))
@app.route(“/auth/register”,方法=[“GET”,“POST”])
def register_user():
现有用户=用户。通过电子邮件获取(会话[“电子邮件”])
如果现有用户为“无”:
email=session[“email”]。lower()#我们的网站正在向我们的应用程序发出请求
用户名=会话[“用户名”]
companyname=会话[“companyname”].lower()
密码=会话[“密码”]。编码(“utf-8”)
hashed_password=bcrypt.hashpw(密码bcrypt.gensalt())
用户注册(电子邮件、用户名、公司名称、哈希密码)
会话[“公司名称”]=公司名称
excisting_company=Database.find_one(collection=“companys”,query={“email”:会话[“email”]})
如果公司为无:
新公司=新公司(会话[“公司名称”]、会话[“电子邮件”])
新公司。公司保存到mongo()
其他:
return“某公司已在您的电子邮件地址下注册”
其他:
返回呈现模板(“email\u ready\u exists.html”)
返回重定向(url\u用于(“用户结果”))
@类方法
def通过电子邮件获取(cls,电子邮件):
find_email=数据库。find_one(collection=“users”,query={“email”:email})
如果“查找电子邮件”不是“无”:
返回cls(电子邮件=查找电子邮件[“电子邮件”],用户名=查找电子邮件[“用户名”],
公司名称=查找电子邮件[“公司名称”],哈希密码=查找电子邮件[“密码”],
日期=查找电子邮件[“日期”],\u id=查找电子邮件[“\u id”])
我似乎不明白为什么,因为当我注册自己时,它工作得很好
在此,我们将非常感谢您的帮助,并提前表示感谢
更新:
下面是我设置会话[“电子邮件”]:
@app.route(“/email\u confirmation”,methods=[“GET”,“POST”])def确认():
错误告诉您会话对象中没有“电子邮件”值 我没有看到您在代码中的任何地方设置此值。它应该如何到达那里?在代码运行之前,需要有人将其设置在某个位置
除此之外,您应该设计代码在这种情况下不会崩溃,因为这可能是一个安全漏洞。如果“email”不在会话中,您可以使用
进行测试。错误告诉您会话对象中没有“email”值
我没有看到您在代码中的任何地方设置此值。它应该如何到达那里?在代码运行之前,需要有人将其设置在某个位置
除此之外,您应该设计代码在这种情况下不会崩溃,因为这可能是一个安全漏洞。如果“email”不在会话中,您可以使用,
进行测试。对不起,忘记添加那段代码了。刚刚用这个代码更新了我原来的问题。非常感谢您的回复。我猜您的电子邮件确认视图在注册过程中必须晚于身份验证/注册视图,或者它没有在出现错误的会话中运行。抱歉,忘记添加该代码。刚刚用这个代码更新了我原来的问题。非常感谢您的回复。我猜您的电子邮件确认视图在注册过程中必须晚于身份验证/注册视图,或者它没有在出现错误的会话中运行。
email = request.form["email"].lower()
companyname = request.form["companyname"].lower()
password = request.form["password"]
username = request.form["username"]
session["password"] = password
session["email"] = email
session["companyname"] = companyname
session["username"] = username
existing_user = User.get_by_email(email)
if existing_user is None:
msg = Message("Confirm your email", sender=("hello@weliketalent.com"),
recipients=[email])
token = ts.dumps(email, salt="email-confirm-key")
confirm_url = url_for("confirm_email", token=token, _external=True)
msg.html = render_template("email/activate.html", confirm_url=confirm_url)
mail.send(msg)