Я пытаюсь создать настраиваемый валидатор 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, форма просто отправляется. Я не могу понять, что здесь идет не так.






После тестирования моего комментария кажется, что многострочное регулярное выражение, вероятно, вызывает у вас проблему.
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)
приведенный выше код работает для меня.
Джон. Я попытался переместить регулярное выражение в одну строку, но он по-прежнему не проверяет ввод. Я тоже видел документы, но не могу понять, что, кажется, идет не так.
Можете ли вы включить данные, которые вы используете?
т.е. какое значение field.data вызывает у вас ошибку?
Любое значение, которое я ввожу в поле, не работает, т.е. если я ввожу действительный URL-адрес или случайный текст, например saljfalsdf, не работает.
не могли бы вы показать мне, как реализовать настраиваемый валидатор URL-адресов для поля ввода строки.
Без тестирования я бы предположил, что, поскольку вы используете
'''для создания многострочной строки для своего регулярного выражения, вы неявно включаете символ\n, который может вызывать у вас проблемы.