为什么在调用flask会话时出现Key错误?

问题描述

我的用户尝试在我的应用程序(这是一个通过MongoDB Atlas在Pythonanywhere上部署的Flask应用程序)上注册时遇到问题。

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

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

existing_user = User.get_by_email(session["email"])

return super(SecureCookieSession,self).__getitem__(key)

抛出了异常KeyError: 'email'

似乎session["email"]不起作用?

这是我的代码:

@app.route('/confirm/<token>')
def confirm_email(token):
    try:
        email = ts.loads(token,salt="email-confirm-key",max_age=7200)

    except:
        return render_template("token_expired.html")

    user = Database.find_one(collection="users",query={"email": email})

    return redirect(url_for("register_user"))


@app.route("/auth/register",methods=["GET","POST"])  
def register_user():

    existing_user = User.get_by_email(session["email"])

    if existing_user is None:

        email = session["email"].lower()  # our website is making a request to our app
        username = session["username"]
        companyname = session["companyname"].lower()
        password = session["password"].encode("utf-8")

        hashed_password = bcrypt.hashpw(password,bcrypt.gensalt())

        User.register(email,username,companyname,hashed_password)   
       
        session["companyname"] = companyname       

        excisting_company = Database.find_one(collection="companies",query={"email": session["email"]})

        if excisting_company is None:

            new_company = NewCompany(session["companyname"],session["email"])
            new_company.company_save_to_mongo()

        else:
            return "A company has already been registered under your email address"

    else:
        return render_template("email_already_exists.html")

    return redirect(url_for("user_results"))


@classmethod
    def get_by_email(cls,email):
        find_email = Database.find_one(collection="users",query={"email": email})
        if find_email is not None:
            return cls(email=find_email["email"],username=find_email["username"],companyname=find_email["companyname"],hashed_password=find_email["password"],date=find_email["date"],_id=find_email["_id"])

我似乎无法弄清楚为什么,因为当我注册自己时,它就可以正常工作。

在此将非常感谢您的帮助,在此先感谢您。

更新:

在这里设置会话[“电子邮件”]:

@ app.route(“ / email_confirmation”,methods = [“ GET”,“ POST”])
def确认():

    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)

解决方法

错误告诉您会话对象中没有“电子邮件”值。

我看不到您在代码中的任何地方设置此值。应该怎么到达那里?在运行此代码之前,需要有人将其设置。

除此之外,您应该设计代码以免在这种情况下崩溃,因为这可能是一个安全漏洞。您可以使用if "email" not in session进行测试。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...