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'),
    # …
]

это автоматически разделит (и соединит) конечные точки косыми чертами.

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