【问题标题】:django rest framework url parameters getting combineddjango rest 框架 url 参数得到组合
【发布时间】:2019-04-27 08:06:31
【问题描述】:

我的 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

有人可以帮忙吗?

【问题讨论】:

    标签: python django rest github frameworks


    【解决方案1】:

    好像

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

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

    “*”、“+”和“?”限定词都是贪婪的;它们匹配尽可能多的文本。有时这种行为是不需要的;如果 RE &lt;.*&gt;'&lt;a&gt; b &lt;c&gt;' 匹配,它将匹配整个字符串,而不仅仅是 '&lt;a&gt;'。添加?在预选赛使其以非贪婪或最低限度的方式进行比赛之后;将匹配尽可能少的字符。使用 RE &lt;.*?&gt; 将仅匹配 '&lt;a&gt;'

    因为. 匹配任何字符,包括\,所以需要将.+ 替换为.+?

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

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

    【讨论】:

    • 我试过上面那个仍然给了我同样的问题。我确实注意到一件事,正则表达式工作了几次,其余时间都不起作用。如果我一次又一次地点击相同的 API 调用,10 个请求中有 1 个得到正确处理:参数得到正确的值,但其余时间它给了我问题中提到的问题。我添加了一个解决方法,将组织中的值拆分为组织和存储库。 :( 不确定这是否是一个错误。
    • @AratiKulkarni 我不知道您是否遇到了错误,但请务必调试每个参数。正则表达式每次都应该以相同的方式匹配相同的字符串。也许在字符串的末尾只有一个 `` 的区别,这决定了它是否像你想要的那样工作。
    猜你喜欢
    • 2014-06-28
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 2015-06-06
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    相关资源
    最近更新 更多