【发布时间】:2021-01-01 23:01:36
【问题描述】:
我遇到了用户尝试在我的应用程序上注册的问题(这是一个使用 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"])
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)
【问题讨论】:
标签: python session flask keyerror