django rest框架的URL参数被合并

时间:2018-11-25 13:59:26

标签: python django rest github frameworks

我的urls.py中包含以下内容:

url(r'^prstatus/(?P<pk>\d+)/(?P<organization>.+)/' + '(?P<repository>.+)/(?P<pr>\d+)/$',PRStatus.get_pr_status, name="one_pr_in_repo"),

我输入的网址是: localhost:8000/api/v1/prstatus/1/myrepo/docker-react/1

但是如果我print(organization, repository, pr)
我得到myrepo/docker-react 2 None

为组织分配了 myrepo / docker-react 而不是 myrepo

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

似乎

r'^prstatus/(?P<pk>\d+)/(?P<organization>.+)/' + '(?P<repository>.+)/(?P<pr>\d+)/$'

是正则表达式。 python documentation for regular expressions解释:

  

'*','+'和'?'限定词都是贪婪的;它们匹配尽可能多的文本。有时这种行为是不希望的;如果RE <.*>'<a> b <c>'匹配,它将匹配整个字符串,而不仅仅是'<a>'。加了吗?在预选赛以非贪婪或极简时尚进行比赛之后;尽可能少地匹配字符。使用RE <.*?>仅匹配'<a>'

由于.与任何字符匹配,包括\,因此您需要将.+替换为.+?

另一种选择是将.更改为更好地反映应匹配的字符的内容。我知道的每个组织和存储库名称都只包含字母数字字符,下划线和空格(由url中的破折号代替),因此这可能会起作用:

r'^prstatus/(?P<pk>\d+)/(?P<organization>[\w-]+)/(?P<repository>[\w-]+)/(?P<pr>\d+)/$'