У меня есть вопрос относительно создания примеров URL-адресов в соответствии с URL-адресом и путем Django.
Например, если у меня есть 2 URL-адреса, например:
path('example/<int:example_id>/', views.some_view, name='example')
url(r'^example/(?P<example_id>[0-9]+)/$', views.some_view, name='example')
Можно ли каким-то образом с помощью встроенных средств Django создать пример полных URL-адресов для таких тестов, как:
example/234/
example/93/
example/228/
etc…
случайно.
Для разных URL-адресов на основе конкретного имени + параметров regex
или converter
?
Другими словами, где в исходном коде Django понимает, что <int:example_id>
является целым числом и так далее. Если у меня есть что-то вроде: 1) я ожидаю example/
2) я ожидаю int
- я смогу использовать его для генерации случайного URL-адреса примера.
Надеюсь это понятно...
Эти URL-адреса являются лишь примером. Реальные URL будут отличаться.
Спасибо.
Что касается создания случайных URL-адресов, не говорится, что за этим стоит объект example_id
, поэтому URL-адреса, которые вы создаете, в конечном итоге могут привести к 404 просмотру.
Но для регулярного выражения вы можете генерировать случайные строки, тем более что это в конечном итоге сводится к конечному автомату.
Другими словами, где в исходном коде Django понимает, что
<int:example_id>
является целым числом и так далее.
По сути, это поиск паттернов <…:…>
в path
. Кроме того, в Django есть набор конвертеров путей. Стандартными являются int
, str
, slug
, uuid
, path
, но вы можете определить свои собственные преобразователи пути. Действительно, в документации Django есть раздел регистрации пользовательских преобразователей пути, в котором объясняется, как вы можете создавать свои собственные преобразователи путей.
Что в основном делает путь, так это создание регулярного выражения. Таким образом, он ищет такие шаблоны, как <int:example_id>
. Поскольку здесь вы использовали int
, используется IntConverter [GitHUb]:
class IntConverter: regex = '[0-9]+' def to_python(self, value): return int(value) def to_url(self, value): return str(value)
Таким образом, здесь он заменит <int:example_id>
на (?<example_id>[0-9]+)
, где будет использоваться часть regex
.
path(…)
не только создает регулярное выражение. Он также автоматически сопоставляет захваченные элементы с объектом Python, вызывая .to_python(…)
. Таким образом, это означает, что если вы работаете с re_path(r'^example/(?P<example_id>[0-9]+)/$', …)
, то example_id
будет строкой, но для path('example/<int:example_id>/', …)
он автоматически вызовет int(…)
для захваченной строки и, таким образом, передаст объект int
. Часто это не имеет большого значения.
Это также верно, когда вы сериализуете объект: вы можете передать значение, и он вызовет .to_url(…)
для объекта, чтобы преобразовать его в строковое представление для сгенерированного URL-адреса. Таким образом, это означает, что вы можете написать собственные преобразователи пути, которые таким образом выполняют более сложные преобразования.
Я ожидаю
example/
2) Я ожидаюint
- я смогу использовать его для генерации случайного URL-адреса примера.
Ну, в конце концов, это сводится к регулярному выражению. Регулярное выражение можно преобразовать в конечный автомат, чтобы мы могли генерировать случайные допустимые строки. Например, exrex [GitHub] способен генерировать все допустимые строки (часто это генератор, который будет предлагать новые строки) или случайные строки, соответствующие регулярному выражению. Однако не сказано, что, поскольку он соответствует path(…)
, он будет иметь смысл для просмотра. Если вы, например, используете этот int
в качестве первичного ключа объекта Post
, который он извлекает, то для случайных URL-адресов, вероятно, вы будете генерировать URL-адреса для несуществующих Post
.
очень плодотворное объяснение. Большое спасибо
Это просто сводится к замене его регулярным выражением: github.com/django/django/blob/master/django/urls/… , а затем, когда параметры захватываются, автоматически вызывается
to_python
при захвате строки: github. com/django/django/blob/master/django/urls/…