Flask 表格大小写敏感问题
我有一个带有用户登录系统的flask应用程序。我现在注意到一些与用于注册和登录该站点的电子邮件地址区分大小写相关的问题TL;DR Question:我如何使用烧瓶表单的小写字母来评估我的数据库中是否存在该用户? 范例 假设用户John Smith在站点上注册了一个帐户。他向约翰登记。Smith@gmail.com然后,我会和约翰一起登录。smith@gmail.com. 截至目前,该网站将认为他们是两个不同的用户。我想这是被认为是同一个用户 在Python(我的强项)中,我只需要使用Flask 表格大小写敏感问题,flask,flask-sqlalchemy,flask-wtforms,Flask,Flask Sqlalchemy,Flask Wtforms,我有一个带有用户登录系统的flask应用程序。我现在注意到一些与用于注册和登录该站点的电子邮件地址区分大小写相关的问题TL;DR Question:我如何使用烧瓶表单的小写字母来评估我的数据库中是否存在该用户? 范例 假设用户John Smith在站点上注册了一个帐户。他向约翰登记。Smith@gmail.com然后,我会和约翰一起登录。smith@gmail.com. 截至目前,该网站将认为他们是两个不同的用户。我想这是被认为是同一个用户 在Python(我的强项)中,我只需要使用str(fo
str(form.email.data).lower()
作为注册表表单,然后将其写入数据库中的用户表。当有人试图登录时,我也会这样做。换句话说,我总是考虑小写的登记和登录。
但是我正在努力在Jinja中实现它,尽管它与Python有相似之处
register.html的电子邮件部分:
<div class="form-group">
{{ form.email.label(class="form-control-label") }}
{% if form.email.errors %}
{{ form.email(class="form-control form-control-lg is-invalid") }}
<div class="invalid-feedback">
{% for error in form.email.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form.email(class="form-control form-control-lg") }}
{% endif %}
</div>
{{form.email.label(class=“form control label”)}
{%if form.email.errors%}
{{form.email(class=“form control form control lg is invalid”)}
{%form.email.errors%}
{{error}}
{%endfor%}
{%else%}
{{form.email(class=“form control form control lg”)}
{%endif%}
routes.py中的寄存器代码:
@app.route("/register", methods=['GET', 'POST'])
def register():
if current_user.is_authenticated:
return redirect(url_for('home'))
form = RegistrationForm()
admins = ['admin@admin.com',
'admin@admin.com']
if form.validate_on_submit():
new_user_email = form.email.data.lower() ###<-----NOTE THAT THIS IS LOWER CASE
admin_test = True if new_user_email in admins else False
invited_test = Invites.query.filter(Invites.invited_email == new_user_email).count()
print(admin_test, invited_test)
if (invited_test == 0) & (admin_test == False): # Not invited and not and admin --> REJECT
flash(
'Sorry but it looks like you were not invited. Please contact a current member for an invitation.',
'warning')
elif (invited_test > 0) | (admin_test == True): ## if they have been invited OR if they are admin
hashed_password = bcrypt.generate_password_hash(form.password.data).decode('utf-8')
#create User object
user = User(username=form.username.data.lower(), ###<----NOTE LOWER CASE
email=form.email.data.lower(), ###<----NOTE LOWER CASE
password=hashed_password)
#write to db
db.session.add(user)
db.session.commit()
#alert user
flash('Welcome to. Enjoy the platform.', 'success')
return redirect(url_for('login'))
else:
#Not invited condition
flash('Sorry but it looks like you were not invited to __. Please contact a current member for an invitation.', 'warning')
return render_template('register.html', title='Register', form=form)
@app.route(“/register”,方法=['GET','POST']))
def寄存器():
如果当前用户已通过身份验证:
返回重定向(url_for('home'))
表单=注册表单()
管理员=['admin@admin.com',
'admin@admin.com']
if form.validate_on_submit():
new_user_email=form.email.data.lower()###拒绝
闪光(
“很抱歉,您似乎未被邀请。请与当前成员联系以获取邀请。”,
"警告")
elif(已邀请的测试>0)|(管理员测试==真):##如果他们已被邀请或是管理员
hashed_password=bcrypt.generate_password_hash(form.password.data).decode('utf-8'))
#创建用户对象
user=user(username=form.username.data.lower(),#
Jinja2
您可以向模板传递过滤器lower
或upper
(请注意,您还可以注册自定义过滤器并在jinja2
上使用它)
SQLAlchemy
与使用==
进行直接比较不同,您可以传递ilike
,使其本质上是不区分大小写的比较:
invests.query.filter(invests.invested\u email.ilike(new\u user\u email)).count()
<div class="form-group">
{{ form.email.label(class="form-control-label") }}
{% if form.email.errors %}
{{ form.email(class="form-control form-control-lg is-invalid") }}
<div class="invalid-feedback">
{% for error in form.email.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form.email(class="form-control form-control-lg") }}
{% endif %}
</div>
#lower
{% user.email|lower %}
#upper
{% user.email|upper %}