if request.method == "POST":
user = None
users = User.query.all()
for x in users:
if x.email == request.form["email"] and check_password_hash(x.password, request.form["password"]):
user = x
if not user:
return render_template("login.html",err = "Invalid Credentials")
else:
login_user(user)
return redirect(url_for("home"))
else:
if current_user.is_authenticated:
return redirect(url_for("home"))
Я всегда обнаруживаю, что устанавливаю переменную = None, а затем проверяю, является ли переменная по-прежнему None, как в примере выше. Я чувствую, что есть лучшие способы написать это, но я не могу придумать ни одного. Любая помощь приветствуется
Вы можете использовать try/except
и поймать NameError
.
try:
login_user(user)
return redirect(url_for("home"))
except NameError:
render_template("login.html",err = "Invalid Credentials")
Это не требует от вас определения user=None
и имеет больше смысла с точки зрения удобочитаемости, если вы ожидаете, что пользователь будет чаще, чем нет. Однако меня немного смущает ваш код, потому что вы перебираете список, но назначаете только одну переменную. Почему бы не поместить весь код в цикл под оператором if
? Я уверен, что у вас есть причина не делать этого, но из вашего кода это не ясно.
Вместо того, чтобы запрашивать базу данных для всех пользователей, а затем циклически просматривать все результаты в вашем приложении, позвольте базе данных сделать всю работу.
Вот как я бы переписал ваш фрагмент кода (я предполагаю, что вы используете Flask-SQLAlchemy):
if request.method == "POST":
user = User.query.filter_by(email=request.form["email"]).first()
if not user or not check_password_hash(user.password, request.form["password"]):
return render_template("login.html", err = "Invalid Credentials")
login_user(user)
return redirect(url_for("home"))
if current_user.is_authenticated:
return redirect(url_for("home"))
Некоторые вещи, которые следует отметить:
break
и continue
утверждения, чтобы избежать ненужной работы.Я считаю, что код в вопросе достаточно хорош, и логика ясна.
Тем не менее, ниже приведен пример использования понимания списка, чтобы показать другой подход. Обратите внимание, что повышения эффективности не будет. Это вопрос предпочтений и стиля.
if request.method == "POST":
def _validated(x):
return (x.email == request.form["email"] and
check_password_hash(x.password, request.form["password"])
users = [x for x in User.query.all() if _validated(x)]
if len(users) == 0:
return render_template("login.html",err = "Invalid Credentials")
else:
login_user(users[0])
return redirect(url_for("home"))
else:
if current_user.is_authenticated:
return redirect(url_for("home"))
Это определенно правильный ответ для этого конкретного случая