fre*_*ish 12 python regex django
我有一个案例,我已经定义了一些Django url模式,现在我想检索与给定模式关联的正则表达式.我想要这样,因为我想将这些正则表达式传递给客户端,所以我也可以检查客户端中的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")
)
Run Code Online (Sandbox Code Playgroud)
那我需要以下功能:
>>> get_regex("User:get_profile")
'^user/profile/(?P<slug>.*)$'
Run Code Online (Sandbox Code Playgroud)
(或者Django翻译它).请注意,我正在使用名称空间.有任何想法吗?Django1.5.
此外,我设法编写一个函数,返回与传递的名称关联的urlpattern对象,但是url.regex.pattern返回'^profile/(?P<slug>.*)$.所以你可以看到没有领先^user/.
所以我尝试了一些事情,最后我想出了自己的解决方案。首先,我将 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
Run Code Online (Sandbox Code Playgroud)
然后我调用generate_paths(urlpatterns)JSON-stringify 结果并将其传递给 JavaScript(请注意,在 JavaScript 中我必须将正则表达式作为字符串转换为RegExp对象)。在 JavaScript 中我有
var recursive_check = function(url, patterns, names, args) {
var l = patterns.length;
for (var i = 0; i < l; i++) {
var pat = patterns[i],
match = pat.pattern.exec(url);
pat.lastIndex = 0;
if (match) {
names.push(pat.namespace || pat.name);
var f = match.shift(),
url = url.replace(f, ""),
ml = match.length;
for (var j = 0; j < ml; j++) {
args.push(match[j]);
}
if (pat.urls) {
recursive_check(url, pat.urls, names, args);
}
break;
}
}
};
var fire_handler = function(url) {
var names = [], args = [];
recursive_check(url, patterns, names, args);
// do something...
};
Run Code Online (Sandbox Code Playgroud)
现在// do something...我可以用names和做一些事情args。例如,我可以保留命名处理程序的字典,我可以搜索处理程序(基于names)并使用 调用它args。
这就是对我有用的解决方案。转换urlpatterns为 JavaScript 模式可能并不完美(因为converter似乎有点过于简化),但它适用于大多数简单的情况。
| 归档时间: |
|
| 查看次数: |
4092 次 |
| 最近记录: |