Python Django按名称获取url正则表达式

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

我有一个例子,我已经定义了一些DjangoURL模式,现在我想检索与给定模式关联的正则表达式。我之所以这样做是因为我想将这些正则表达式传递给客户端,这样我也可以检查客户端中的URL(我说的是浏览器端历史操作),并在匹配时启动相应的处理程序(JavaScript)

例如,如果我有:

# 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))