【问题标题】:form validation does not clear after function call函数调用后表单验证不清除
【发布时间】:2021-08-17 19:54:25
【问题描述】:

我正在编写一段代码来检查有效的用户凭据,就像在我的应用中一样:

@app.route('/register', methods=('GET', 'POST'))
def register():
    if request.method == 'POST':
        username = request.form['username']
        email = request.form['email']
        password = request.form['password']
        db = get_db()
        error = None

        if not username:
            error = 'Username is required'
        if validate_user(username) is False:
            error = 'Usernames must be 5 to 10 in length, not start with a number and use only lowercase.'
        elif not email:
            error = 'Email is required'
        elif not password:
            error = 'Password is required'

在验证用户的函数中,代码如下:

def validate_user(user):
    valid_user = re.compile(r'\D{1}[D\d]{4,9}')
    matched = valid_user.match(user)
    if matched:
        return True
    else:
        return False

在我使用 的表单中,我有以下代码,特定于 user 部分:

{% block content %}
  <form method="post">
  <div>
    <label for="username">Username</label>
    <input type="text" name="username" id="username" size="45"
           title="cannot start with a number, have a length of 5 to 10 non-special characters" required>
   </div>

当我测试这个功能时,即使一切看起来都已经到位,页面也不会通过注册。真的在这上面旋转我的轮子,因为它看起来很微不足道......

【问题讨论】:

  • 不熟悉flask或jinja,但对您如何在此处呈现模板有疑问?
  • 该模板由jinja 渲染,它需要一个html 文件并对其进行一定的标记。更多信息在这里jinja.palletsprojects.com/en/3.0.x
  • 是的,我知道,但代码中没有,这就是我问的原因。
  • 这是你完整的注册功能吗?我希望最后有一个回报声明。例如重定向到登录表单或类似的东西
  • @shiny - 这是完整代码的一部分,是的,它最后有一个返回,但这里省略了

标签: jinja python html regex flask jinja2


【解决方案1】:

此模式\D[D\d]{4,9} 匹配除数字以外的任何字符,然后匹配 D 字符或数字的 4-9 倍。如果没有$,它也是未锚定的,re.match 返回匹配对象的最大长度不是 10

如果你想要用户名:

用户名长度必须为 5 到 10,不能以数字开头并使用 只能小写。

\D[^A-Z]{4,9}$

Regex demo

请注意,\D[^A-Z] 也可以匹配空格和换行符。

如果不允许,您可以使用否定字符类将\s 从范围中排除。当您在代码中使用re.match 时,您可以省略^ 锚点。

[^\s\d][^\sA-Z]{4,9}$

Regex demo

【讨论】:

  • 我不知道换行符或空格的行为。这很有帮助。但是对于我的原始正则表达式,我确实注意到了这个错字之后发布了一点。使用锚点的原因是什么,尽管它对原始正则表达式的使用和不使用都一样?对于测试,尝试了 'user@12345' 和 'user@1234' 并且都有效。
  • @etch_45 是的,user@12345 有效,但 user@123456789 应该无效。见regex101.com/r/rKP36C/1如果你省略了锚点,它将是有效的。见regex101.com/r/QPJqdg/1
  • 好的,我现在看到了。在评论之前做了一个快速测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-29
  • 1970-01-01
相关资源
最近更新 更多