Пользовательский валидатор Python Flask WTForms не работает

Я пытаюсь создать настраиваемый валидатор URL для поля ввода формы, но валидатор не работает. Я применил DataRequired() к 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')

HTML для того же:

{% 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 %}

Даже когда я отправляю ввод без URL, форма просто отправляется. Я не могу понять, что здесь идет не так.

Без тестирования я бы предположил, что, поскольку вы используете ''' для создания многострочной строки для своего регулярного выражения, вы неявно включаете символ \n, который может вызывать у вас проблемы.

John 30.08.2018 22:04
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
853
1

Ответы 1

После тестирования моего комментария кажется, что многострочное регулярное выражение, вероятно, вызывает у вас проблему.

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)

приведенный выше код работает для меня.

Джон. Я попытался переместить регулярное выражение в одну строку, но он по-прежнему не проверяет ввод. Я тоже видел документы, но не могу понять, что, кажется, идет не так.

AKuro 30.08.2018 22:13

Можете ли вы включить данные, которые вы используете?

John 30.08.2018 22:14

т.е. какое значение field.data вызывает у вас ошибку?

John 30.08.2018 22:19

Любое значение, которое я ввожу в поле, не работает, т.е. если я ввожу действительный URL-адрес или случайный текст, например saljfalsdf, не работает.

AKuro 30.08.2018 22:23

не могли бы вы показать мне, как реализовать настраиваемый валидатор URL-адресов для поля ввода строки.

AKuro 30.08.2018 22:24

Другие вопросы по теме