Проверка url изображений Docker для django

Я хочу получить URL-адрес образа докера от пользователя, но URL-адреса не могут быть приемлемыми с models.URLField() в django.
Например, этот URL: hub.something.com/nginx:1.21, получил ошибку.
Как это исправить?

Попробуйте это:

from django.core.validators import URLValidator
from django.utils.deconstruct import deconstructible
from django.db import models

# I suggest to move this class to validators.py outside of this app folder 
# so it can be easily accessible by all models
@deconstructible
class DockerHubURLValidator(URLValidator):
    domain_re = r"(?:\.(?!-)[a-z" + URLValidator.ul + r"0-9-]{1,63}(?<!-))(?:[a-z0-9-.\/:]*)"


class ModelName(models.Model):
    image = models.CharField(max_length=200, validators=[DockerHubURLValidator()])

Я не очень хорошо разбираюсь в регексах, но я считаю, что сделал все правильно, когда пробую регекс: (?:\.(?!-)[a-z0-9-]{1,63}(?<!-))(?:[a-z0-9-.\/:]*)

Позволяет как домен: .com/nginx:1.21

Если будет другой случай с regex, или по какой-то причине этот regex не будет работать так, как я ожидаю, я верю, что отсюда вы найдете выход ;) Просто проверьте код URLValidator и измените его соответствующим образом.

PS. Извините за опоздание, гулял с собакой

from django.db import models
from django.core.validators import RegexValidator


class App(models.Model):
    image = models.CharField(
        max_length=200,
        validators=[
            RegexValidator(
                regex=r'^(?:(?=[^:\/]{1,253})(?!-)[a-zA-Z0-9-]{1,63}(?<!-)(?:\.(?!-)[a-zA-Z0-9-]{1,63}(?<!-))*(?::[0-9]{1,5})?/)?((?![._-])(?:[a-z0-9._-]*)(?<![._-])(?:/(?![._-])[a-z0-9._-]*(?<![._-]))*)(?::(?![.-])[a-zA-Z0-9_.-]{1,128})?$',
                message='image is not valid',
                code='invalid_url'
            )
        ]
    )

Ссылка на регекс находится здесь и вы можете проверить matchs.

Вернуться на верх