用于捕获 URL 中所有文件夹的正则表达式模式,包括正斜杠

Regex pattern to capture all folders in URL including forward slash

我想匹配动态创建的URLs,它可以有多个文件夹。为此需要一些正则表达式模式。例如

http://127.0.0.1:8000/api/:user_id/:foldersa/:folders1/
http://127.0.0.1:8000/api/:user_id/:foldersb/:folders2/:folders3/:folders4
http://127.0.0.1:8000/api/:user_id/:foldersc/:folders2/
http://127.0.0.1:8000/api/:user_id/:foldersd/:folders1/:folders2/

所以直到 BASE_URL/api/:user_id/ 是常见的。我可以捕获 user_id 但想在单个字符串变量上捕获 user_id 之后的其他参数。
在那之后,可以有任意数量的文件夹,我想将它们全部捕获在一个字符串变量中。
就像捕获的第一个 URL 字符串变量将是 "foldera/folder1/" 而对于下一个 url 字符串变量将是 "folderb/folder2/folder3/folder4" 以及 fwd 斜杠。

我应该在 urls.py 中写什么正则表达式模式来捕获这个文件夹?
我试过 re_path(r'(?P<user_id>[-\w]+)/(?P<customUrl>(.*?)(?:\/)?$)/.*', customLink, name='customLink'),

但无法正常工作。

您可以匹配除最后一个可选尾部斜杠之外的所有内容:

re_path(r'(?P<user_id>[-\w]+)/<strong>(?P<custom_url>.*?)</strong>/?$', customLink, name='customLink'),

在视图中,您可以将端点拆分为:

def customLink(request, user_id, custom_url):
    endpoints = custom_url<strong>.split('/')</strong>
    # …

您还可以使用路径转换器:

# <em>app_name</em>/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 <em>app_name</em>.converters import EndpointsConverter

<strong>register_converter(</strong>EndpointsConverter, 'endpoints'<strong>)</strong>

urlpatterns = [
    path('<str:user_id>/<strong><endpoints:</strong>endpoints<strong>></strong>/', customLink, name='customLink'),
    # …
]

这将通过斜杠自动拆分(和连接)端点。