簡體   English   中英

調用flask會話時為什么會出現Key錯誤?

[英]Why do I get a Key error when calling flask session?

我有用戶嘗試在我的應用程序上注冊的問題(這是一個使用 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"])

我似乎無法弄清楚為什么,因為當我注冊自己時它工作得很好。

非常感謝您的幫助,在此先感謝您。

更新:

這是我設置會話 ["email"] 的地方:

@app.route("/email_confirmation", methods=["GET", "POST"])
定義確認():

    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進行測試,您可以使用if "email" not in session

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM