Python 为什么调用flask会话时会出现密钥错误?

Python 为什么调用flask会话时会出现密钥错误?,python,session,flask,keyerror,Python,Session,Flask,Keyerror,我遇到了一个问题,用户试图注册我的应用程序(这是一个使用MongoDB Atlas部署在Pythonywhere上的Flask应用程序) 基本上,当他们注册时,他们会收到一封带有令牌的电子邮件,需要点击确认。当他们点击这个链接时,他们应该进入应用程序,但是他们收到了一个错误 当我检查错误日志时,当它调用时,我看到的是(在“/auth/register”下): existing_user=user。通过电子邮件获取(会话[“email”]) 返回super(SecureCookieSession,

我遇到了一个问题,用户试图注册我的应用程序(这是一个使用MongoDB Atlas部署在Pythonywhere上的Flask应用程序)

基本上,当他们注册时,他们会收到一封带有令牌的电子邮件,需要点击确认。当他们点击这个链接时,他们应该进入应用程序,但是他们收到了一个错误

当我检查错误日志时,当它调用时,我看到的是(在“/auth/register”下):

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)