Regex паттерн для захвата всех переменных в url, включая прямую косую черту
Я хочу сопоставить динамически создаваемые урлы, которые могут иметь несколько конечных точек. Для этого нужен какой-то шаблон regex. Например,
http://127.0.0.1:8000/api/:user_id/:endpointa/:endpoint1/
http://127.0.0.1:8000/api/:user_id/:endpointb/:endpoint2/:endpoint3/:endpoint4
http://127.0.0.1:8000/api/:user_id/:endpointc/:endpoint2/
http://127.0.0.1:8000/api/:user_id/:endpointd/:endpoint1/:endpoint2/
so до BASE_URL/api/:user_id/ является обычным. Я могу поймать user_id, но хочу поймать другие параметры после user_id в одной строковой переменной.
После этого может быть любое количество конечных точек, и я хочу поймать их все в одну единственную строковую переменную.
например, для первого url строковая переменная будет "endpointa/endpoint1/" и для следующего url строковая переменная будет "endpointb/endpoint2/endpoint3/endpoint4" вместе со слешами вперед.
Какой шаблон regex нужно написать в urls.py для перехвата этих переменных?
Я пробовал с
re_path(r'(?P<user_id>[-\w]+)/(?P<customUrl>(.*?)(?:\/)?$)/.*', customLink, name='customLink'),
но не смог заставить его работать.
Вы можете сопоставить все, кроме последней необязательной косой черты:
re_path(r'(?P<user_id>[-\w]+)/(?P<custom_url>.*?)/?$', customLink, name='customLink'),
в представлении вы можете разделить конечные точки с помощью:
def customLink(request, user_id, custom_url):
endpoints = custom_url.split('/')
# …
Вы также можете использовать конвертер путей:
# app_name/converters.py
class EndpointsConverter:
regex = ".*?"
def to_python(self, value):
return value.split('/')
def to_url(self, value):
if isinstance(value, str):
return value
return '/'.join(value)
тогда вы можете работать с конвертером путей:
from django.urls import path, register_converter
from app_name.converters import EndpointsConverter
register_converter(EndpointsConverter, 'endpoints')
urlpatterns = [
path('<str:user_id>/<endpoints:endpoints>/', customLink, name='customLink'),
# …
]
это автоматически разделит (и соединит) конечные точки косыми чертами.