gpt4 book ai didi

python - Django REST 框架验证错误 : 'Enter a valid URL.'

转载 作者:太空宇宙 更新时间:2023-11-03 15:44:26 24 4
gpt4 key购买 nike

在我的 Django REST Framework 项目中,我有一个模型类用于保存 Django 应用程序将在后台任务中抓取的服务:

class Service(models.Model):
name = models.CharField(max_length=50)
description = models.CharField(max_length=250)
root_url =URLField(unique=True)

早些时候,我在本地机器上运行了这些服务和 Django 应用程序。现在我将服务和 Django 应用程序容器化,并让它们在 Docker 上运行。

所以现在我在添加 dockerized 服务时遇到了问题,因为它的根 URL:http://sensor-service:8080/。抛出的错误是:'Enter a valid URL.'

向我的 Django REST API 发送 POST 时以及通过 Django REST Framework 提供的 GUI 添加服务时都会出现问题。

因此,基于 https://stackoverflow.com/a/49262127/5433896http://www.django-rest-framework.org/api-guide/serializers/#field-level-validation我尝试了以下。注意:最重要的行是第 5 行:允许主机名后跟域和/或 TLD。

模型.py:

class DockerServiceDNSUrlsCompatibleURLValidator(URLValidator):
def __init__(self, schemes=None, **kwargs):
self.host_re = '(' + self.hostname_re + self.domain_re + self.tld_re \
+ '|localhost|' \
+ self.hostname_re + ')' # <=== added: "hostname not followed by a domain and/or TLD is acceptable"
self.regex = _lazy_re_compile(r'^(?:[a-z0-9\.\-\+]*)://' # scheme is validated separately
r'(?:\S+(?::\S*)?@)?' # user:pass authentication
r'(?:' + self.ipv4_re + '|' + self.ipv6_re + '|' + self.host_re + ')'
r'(?::\d{2,5})?' # port
r'(?:[/?#][^\s]*)?' # resource path
r'\Z',
re.IGNORECASE)
super().__init__(schemes, **kwargs)


class DjangoServiceDNSUrlsCompatibleFormURLField(forms.fields.URLField):
default_validators = [DockerServiceDNSUrlsCompatibleURLValidator()]


class DjangoServiceDNSUrlsCompatibleURLField(models.URLField):
default_validators = [DockerServiceDNSUrlsCompatibleURLValidator()]

def formfield(self, **kwargs):
return super(DjangoServiceDNSUrlsCompatibleURLField, self).formfield(**{
'form_class': DjangoServiceDNSUrlsCompatibleFormURLField,
})


class Service(models.Model):
name = models.CharField(max_length=50)
description = models.CharField(max_length=250)
root_url = DjangoServiceDNSUrlsCompatibleURLField(unique=True)

序列化程序.py:

class ServiceSerializer(serializers.HyperlinkedModelSerializer):
validators = [DockerServiceDNSUrlsCompatibleURLValidator()]

def validate_root_url(self, value):
DockerServiceDNSUrlsCompatibleURLValidator(value) # will throw validation exception if value isn't OK.
return value

但是,仍然会抛出错误 'Enter a valid URL.'。有人看到我的方法有问题吗?或者有没有人 - 最坏的情况,但仍然可以接受 - 知道我如何才能完全关闭该字段上的 URLValidation?

最佳答案

如果您有自己的正则表达式,为什么不直接使用 models.CharField 而不是 URLField?喜欢:

模型.py

phone_regex = RegexValidator(
regex=r'^\+?(?:\(?[0-9]\)?\x20?){4,14}[0-9]$',
message="Error....")

class FooModel(models.Model):
phone = models.CharField("Phone Number", validators=[
phone_regex], max_length=26, blank=True, null=True)

顺便说一句,要自定义 URLValidator 接受不带“http/https”的 url,我在下面使用

模型.py

class OptionalSchemeURLValidator(URLValidator):
def __call__(self, value):
if '://' not in value:
# Validate as if it were http://
value = 'http://' + value
super(OptionalSchemeURLValidator, self).__call__(value)

class FooModel(models.Model):
website = models.CharField(max_length=200, validators=[OptionalSchemeURLValidator()])

这不会改变上传的值,只是让验证通过。我在我的 DRF 上试过了,它有效。

引用Alasdair's answer , 感谢 Alasdair

关于python - Django REST 框架验证错误 : 'Enter a valid URL.' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50882673/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com