Python Django按名称获取url正则表达式
我有一个例子,我已经定义了一些DjangoURL模式,现在我想检索与给定模式关联的正则表达式。我之所以这样做是因为我想将这些正则表达式传递给客户端,这样我也可以检查客户端中的URL(我说的是浏览器端历史操作),并在匹配时启动相应的处理程序(JavaScript) 例如,如果我有:Python Django按名称获取url正则表达式,python,regex,django,Python,Regex,Django,我有一个例子,我已经定义了一些DjangoURL模式,现在我想检索与给定模式关联的正则表达式。我之所以这样做是因为我想将这些正则表达式传递给客户端,这样我也可以检查客户端中的URL(我说的是浏览器端历史操作),并在匹配时启动相应的处理程序(JavaScript) 例如,如果我有: # urls.py urlpatterns = patterns("", url(r"^$", Index.as_view(), name="index"), url(r"^user/", includ
# urls.py
urlpatterns = patterns("",
url(r"^$", Index.as_view(), name="index"),
url(r"^user/", include("User.urls", namespace="User")),
)
# User/urls.py
urlpatterns = patterns("",
url(r"^profile/(?P<slug>.*)$", GetProfile.as_view(), name="get_profile")
)
#url.py
urlpatterns=模式(“”,
url(r“^$”,Index.as_view(),name=“Index”),
url(r“^user/”,包括(“user.url”,namespace=“user”),
)
#User/url.py
urlpatterns=模式(“”,
url(r“^profile/(?P.*)”,GetProfile.as\u view(),name=“get\u profile”)
)
然后我需要以下函数:
>>> get_regex("User:get_profile")
'^user/profile/(?P<slug>.*)$'
获取正则表达式(“用户:获取配置文件”)
“^user/profile/(?P.*)”
(或者不管Django如何翻译)。请注意,我使用的是名称空间。有什么想法吗?Django1.5
我还成功地编写了一个函数,返回与传递的名称相关联的urlpattern对象,但是执行
url.regex.pattern
返回“^profile/(?p.*)$
。因此,正如您所看到的,没有领先的^user/
有几种javascript反向实现
这不是正则表达式,但您可以像在服务器中一样在客户端代码中测试URL,因此我认为这更好
编辑:由于您需要忽略URL参数,因此可以从django js的源代码中获得一些想法。它已经删除了可选的URL参数,所以它可能与您描述的非常相似
代码在每个模式上迭代,从每个参数subtex中删除?p
,这样您就可以用*
替换它们
关键是,您在该源代码中有可能需要执行实现的每个正则表达式。请参见第24-29行中的全局模式。尝试以下操作:
from django.core.urlresolvers import get_resolver
resolver = get_resolver(None)
url = resolver.reversed_dict.getlist('get_profile')
if url:
pattern = url[0][1]
据我所知,您希望能够返回给定视图的正则表达式(而不是url)
这是我的解决方案草图:
该函数返回的一个实例。这个类确实存储正则表达式,因为它调用\uuuu init\uuuu
(and)
所以,我认为你可以
反向搜索view plus命名空间
从元组模式的元组中获取该视图的元组
返回与视图对应的元组的第一个参数LocaleRegexProvider.\u regex
(or)的_regex
我不确定这是否有效(未经测试),也不确定它是否是最佳解决方案,但至少您有一些关于Django存储正则表达式的链接。因此我尝试了一些方法,最后我提出了自己的解决方案。首先,我将urlpatterns转换为JavaScript能够理解的形式:
import re
converter = re.compile(r"\?P<.*?>")
def recursive_parse(urlpatterns, lst):
for pattern in urlpatterns:
obj = {
"pattern": converter.sub("", pattern.regex.pattern)
}
if hasattr(pattern, "name") and pattern.name is not None:
obj["name"] = pattern.name
if hasattr(pattern, "namespace"):
obj["namespace"] = pattern.namespace
if hasattr(pattern, "url_patterns"):
if "urls" not in obj:
obj["urls"] = []
recursive_parse(pattern.url_patterns, obj["urls"])
lst.append(obj)
def generate_paths(urlpatterns):
paths = []
recursive_parse(urlpatterns, paths)
return paths
现在在//做点什么…
我可以用名称
和参数
做点什么。例如,我可以保留一个命名处理程序的字典,我可以搜索一个处理程序(基于名称
),并使用参数调用它
这是对我有效的解决方案。将urlpatterns
转换为JavaScript模式可能并不完美(因为converter
似乎有点过于简化),但它在大多数简单的情况下都能工作。这不是一个答案,但对于其他人来说可能很有用
下面根据@Freakish的代码生成Django项目中所有完整url模式的列表,包括嵌套的UrlRegexResolver
import re
from django.core.urlresolvers import get_resolver
converter = re.compile(r"\?P<.*?>")
def trim_leading_caret(s):
return s[1:] if s.startswith('^') else s
def recursive_parse(urlpatterns, lst, prefix=None):
for pattern in urlpatterns:
path = (prefix or '') + trim_leading_caret(converter.sub("", pattern.regex.pattern))
if hasattr(pattern, "url_patterns"):
recursive_parse(pattern.url_patterns, lst, path)
else:
lst.append('^' + path)
def generate_paths(urlpatterns):
paths = []
recursive_parse(urlpatterns, paths)
return paths
generate_paths(get_resolver(None))
重新导入
从django.core.urlResolver导入get_解析器
转换器=重新编译(r“\?P”)
def微调引导插入符号:
如果s.startswith(“^”)else s,则返回s[1:]
def recursive_parse(urlpatterns,lst,prefix=None):
对于URL模式中的模式:
path=(前缀或“”)+trim\u前导字符\u插入符号(converter.sub(“,pattern.regex.pattern))
如果hasattr(模式,“url\u模式”):
递归解析(pattern.url\u patterns、lst、path)
其他:
lst.append(“^”+路径)
def生成路径(urlpatterns):
路径=[]
递归解析(URL模式、路径)
返回路径
生成路径(获取解析器(无))
您可以显示一段视图吗。py它可能是helpful@drabo2005那会有什么帮助?内容与此无关。@奇怪的只是一个指针:如果查看django.core.urlResolver.py
中的RegexURLResolver
类,它有一个反向dict
属性。它应该有你想要的图案。请看第385行,同一个文件。您是否尝试过^user/profile/(?P[^/]+)/$
@hwnd我试图避免手动编写正则表达式(视图过多)。我的情况不是这样。我不是在尝试反向URL。我正在尝试获取正则表达式,这样如果URL与JavaScript中的正则表达式匹配,我就可以启动一个处理程序?如果(url==reverse('name'))
就不能执行if(url===reverse('name'))
不同之处在于,在我上面展示的示例中,url可以有额外的参数,比如slug
。因此,给定的url是(例如)/user/profile/root
,您将如何使用reverse
?我需要将它与regex匹配。有一个django命令来列出所有的url模式,我猜它被称为url或show_url。您可以看看这个命令的实现。这个问题可能有助于@freakish查看他们的源代码是的,这正是我所说的“我已经成功编写了一个函数”部分的意思。不幸的是,\u regex
(似乎与.regex.pattern
相同)只保存有关其自身正则表达式的信息(在url(…)
中定义),而不是整个路径(它不包括url(…,include(…)
)。首先:resolver.reverse\u dict
在调用reverse
时填充(在我的情况下可能根本不会发生)。第二:同样的问题:它不包括整个url模式(前缀^user/
将丢失)
import re
from django.core.urlresolvers import get_resolver
converter = re.compile(r"\?P<.*?>")
def trim_leading_caret(s):
return s[1:] if s.startswith('^') else s
def recursive_parse(urlpatterns, lst, prefix=None):
for pattern in urlpatterns:
path = (prefix or '') + trim_leading_caret(converter.sub("", pattern.regex.pattern))
if hasattr(pattern, "url_patterns"):
recursive_parse(pattern.url_patterns, lst, path)
else:
lst.append('^' + path)
def generate_paths(urlpatterns):
paths = []
recursive_parse(urlpatterns, paths)
return paths
generate_paths(get_resolver(None))