0

我有一个 Django 视图,它接受三个可选的关键字参数。我想在一行中处理正则表达式以将可能的 url 与该视图匹配。我想很好地构造网址。

一个例子:我可能的参数是 start 是一个 int,serial 是一个长度为 13 的字符串,end 是另一个 int。

网址可能如下所示:

/main/s20130509/e20130510/ABC1234567890
or
/main/s20130509/e20130510/
or 
/main/ABC1234567890

其中 e 和 s 前缀组件分别是 end 和 start ,ABC1234567890 是串行的。

我想提取这些结束、开始、序列值并将它们作为值 start=s20130509 等传递给视图...

现在我通过在单独的行上详尽列出排列来做到这一点,似乎必须有更好的方法。

我正在尝试做类似的事情:

url(r'^base_url/(?P<serial>[^/]{13}|(?P<end>e\d{8})|(?P<start>s\d{8})/*$', view_method),

基本上,我想做的事情的逻辑对我来说很清楚;我想提取三个匹配项中任何一个的所有实例并将它们作为关键字参数传递,但我找不到资源来找出适合此的正则表达式语法。

有什么想法吗?我很乐意做任何能优雅地完成工作的事情。

谢谢你的时间,

蒂姆

4

1 回答 1

1

你想要的是:

url(r'^base_url/(?P<serial>[^/]{13}/$', view_method),

为 theendstartkwargs 添加可选组,因此:

# Optional, non-capturing group surrounding the named group for each (so you don't have to capture the slashes or the "e" or "s"
(?:e(?P<end>\d{8})/)

然后,最多允许其中 2 个,按任意顺序:

((?:s(?P<start>\d{8})/)|(?:e(?P<end>\d{8})/)){0,2}

结果是:

url(r'^base_url/((?:s(?P<start>\d{8})/)|(?:e(?P<end>\d{8})/)){0,2}(?P<serial>[^/]{13})/$', view_method),

免责声明,我在这个框中写了这个,所以我需要一点时间来测试它并更新答案(如果它是错误的)。

更新:

确实,它起作用了:)我匹配了以下内容:

http://127.0.0.1:8080/base_url/e77777777/s88888888/1234567890123/
http://127.0.0.1:8080/base_url/s88888888/e77777777/1234567890123/
http://127.0.0.1:8080/base_url/s88888888/1234567890123/
http://127.0.0.1:8080/base_url/e77777777/1234567890123/
http://127.0.0.1:8080/base_url/1234567890123/

getkwargs 看起来像这样(当请求所有三个段时,在子类的方法中引发异常View- 结束和/或开始None时被忽略):

{'start': u'88888888', 'serial': u'1234567890123', 'end': u'77777777'}
于 2013-05-09T22:33:14.923 回答