用于捕获 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'),
# …
]
这将通过斜杠自动拆分(和连接)端点。
我想匹配动态创建的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'),
# …
]
这将通过斜杠自动拆分(和连接)端点。