Python Flask WTForms自定义验证器不起作用

时间:2018-08-30 19:12:48

标签: python url flask flask-wtforms

我正在尝试为表单输入字段创建自定义URL验证器,但是验证器似乎不起作用。我在StringField上应用了def validate_domain(form, field): url_regex = r'''((http|https)\:\/\/)?[a-zA-Z0-9\.\/\?\:@\-_=#]+\. ([a-zA-Z]){2,6}([a-zA-Z0-9\.\&\/\?\:@\-_=#])*''' regex = re.compile(url_regex) url = regex.match(field.data).group() if url: field.data = 'http://' + urlparse(url).netloc else: raise ValidationError('Please enter a valid URL.') class SubmitDomainForm(Form): domain = StringField('Domain', validators=[DataRequired(), validate_domain]) submit = SubmitField('Crawl') ,但效果很好,但是自定义验证器却没有。这是代码:

{% extends "layout.html" %}
{% block content %}
<div class="content-section">
    <form method="POST" action="">
        {{ form.hidden_tag() }}
        <fieldset class="form-group">
            <legend class="border-bottom mb-4">{{ legend }}</legend>
            <div class="form-group">
                {{ form.domain.label(class="form-control-label") }}
                {% if form.domain.errors %}
                    {{ form.domain(class="form-control form-control-lg is-invalid") }}
                    <div class="invalid-feedback">
                        {% for error in form.domain.errors %}
                            <span>{{ error }}</span>
                        {% endfor %}
                    </div>
                {% else %}
                    {{ form.domain(class="form-control form-control-lg") }}
                {% endif %}
            </div>
        </fieldset>
        <div class="form-group">
            {{ form.submit(class="btn btn-outline-info") }}
        </div>
    </form>
{% endblock content %}

HTML相同:

 Prism.highlightAll() 

即使我提交非URL输入,表单也只是提交。我无法弄明白这里出了什么问题。

1 个答案:

答案 0 :(得分:0)

在测试我的评论后,似乎对正则表达式进行多行处理可能会导致问题

import re
from urllib.parse import urlparse

data = 'https://google.com/#resource'

url_regex = r'''((http|https)\:\/\/)?[a-zA-Z0-9\.\/\?\:@\-_=#]+\.([a-zA-Z]){2,6}([a-zA-Z0-9\.\&\/\?\:@\-_=#])*'''
regex = re.compile(url_regex)
url = regex.match(data).group()
print('http://' + urlparse(url).netloc)

上面的代码对我有用。