首先,regex部分应该如下所示:
r ^/rss/(?P<anynumber>d+)/(?P<anystring>.+)/$
<;…中的那些字符串>代码>部分允许您为正则表达式匹配的任何内容指定名称。Django将使用该名称将值传递给您的函数。因此,函数必须有一个同名的参数。在这种情况下,Django将获取名为anynumber
的值,并将该值用于名为anynumber
的函数的参数。anystring
也是如此,这个系统让您不用担心函数的参数顺序。
d+
将匹配一个或多个数字字符(数字)。如果您想要捕获的是正则表达式,那么最好将正则表达式限制为只匹配数字,而不是任何字符,并希望只显示数字。如果您想将数字部分限制为一定数量的数字,可以使用d{1,4}
从一位数字到四位数字。
下一部分(?P<;anystring>;.+)
将捕获由一个或多个任意字符组成的字符串。这实际上会匹配类似letters/moreletters
的内容,包括斜杠。Python正则表达式中有许多“特殊序列”可能会有所帮助。要只匹配数字、字母和下划线,请使用w
,如在(?P<;anystring>;w+)
中所示。为了更宽松但忽略空白或任何其他无意义的字符,(?P<;anystring>;[a-zA-Z1-9:;_{}[])
可以捕获大量字符。确保转义正则表达式中可能是特殊字符的任何字符。但是,要保守。如果你允许太多选项,谁知道你以后必须解决什么样的错误。
现在转到<code>url</code>函数的name参数。该名称不是它将捕获的模式传递给函数的名称。它是视图函数的特定调用类的名称,可以在其他上下文中用作简写,如模板标记{%url视图名称arg1 arg2%}
。因此,您已经拥有的名称“anything”指的是对视图函数的调用,并向其传递一个恰好被称为anything的关键字参数。对于要传递两个字符串的情况,请为其指定一个类似“rss数字字符串”的名称,以表示要采用的参数,或者指定一个引用视图将使用该组合执行的特殊函数的名称。
我总是为同一个函数使用多个名称,关键是:
def makerss(request, anystring=None, anynumber=None):
通过给参数提供默认值,它允许您以不同的方式使用相同的函数。在这种情况下,当您只想传递anystring
的值时,或者当anystring
和anynumber
应该有值时,可以使用该函数。
我知道这有很多不同的地方,所以我会把它们放在一起,这样你就可以看到它是如何工作的。要有两个url,一个捕获字符串并将其传递,另一个捕获数字、斜杠,然后是字符串,但都指向同一个视图函数,可以使用以下方法:
urlpatterns = patterns( ,
url(r ^rss/(?P<anystring>w+)/$ , rss.rssama.views.makerss , name= rss-anystring ),
url(r ^rss/(?P<anynumber>d+)/(?P<anystring>w+)/$ , rss.rssama.views.makerss , name= rss-number-string ),
url(r ^$ , rss.rssama.views.home ),
)
使用类似以下的视图函数:
def makerss(request, anystring=None, anynumber=None):
if anystring:
if anynumber:
#Do something with the string and the number
else:
#Do something with just the string
如果这有帮助,请告诉我。此外,姜戈摇滚,太棒了!
Python Regex库文档