如何验证 django URLfield 是不是来自特定域或主机名?

Posted

技术标签:

【中文标题】如何验证 django URLfield 是不是来自特定域或主机名?【英文标题】:How do I validate if a django URLfield is from a specific domain or hostname?如何验证 django URLfield 是否来自特定域或主机名? 【发布时间】:2020-12-29 00:36:52 【问题描述】:

您好,我想看看 models.URLfield 是来自 youtube 还是 soundcloud。

url = models.URLField("URL", max_length=255, unique = True)

我该怎么做?

【问题讨论】:

【参考方案1】:

创建一个验证器方法,它解析 url 并检查主机名,并将其添加到您的字段中。

from urllib.parse import urlparse
from django.db import models
from django.core.exceptions import ValidationError


def validate_url(value):
    if not value:
        return  # Required error is done the field
    obj = urlparse(value)
    if not obj.hostname in ('youtube.com', 'soundcloud.com'):
        raise ValidationError('Only urls from YouTube or SoundCloud allowed')


class ModelA(models.Model):
    url = models.URLField(
        verbose_name="URL", max_length=255, unique=True, validators=[validate_url]
    )

编辑示例;验证器不应返回值。这不像是表单上的干净方法。

查看更多信息:

https://docs.python.org/3/library/urllib.parse.html https://docs.djangoproject.com/en/3.1/ref/validators/

【讨论】:

查看 urllib 文档。它还具有 netloc 等值,其中包含 www 和方案。因此,您可以使用 and obj.scheme == 'https' 扩展 if 语句(例如)

以上是关于如何验证 django URLfield 是不是来自特定域或主机名?的主要内容,如果未能解决你的问题,请参考以下文章

Django URLField 和 HTML5?

使用 URLField 优于 TextField 的优势?

如何在 Django 中自定义 slug 字段?

如何避免在 django 中选择 n+1?

Django 管理界面中的 Exclusive 或 ForeignKey

如何在 Django 中将 2 个模型字段结合在一起?