Django остальные рамки URL параметры объединяются - PullRequest
0 голосов
/ 25 ноября 2018

В моем urls.py:

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

есть следующий URL: localhost:8000/api/v1/prstatus/1/myrepo/docker-react/1

Но если я print(organization, repository, pr).
Я получаю myrepo/docker-react 2 None

Организация получает назначение myrepo / docker-response вместо myrepo .

Может ли кто-нибудь помочь в этом

1 Ответ

0 голосов
/ 25 ноября 2018

Кажется, что

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

- это регулярное выражение. документация по python для регулярных выражений объясняет:

'*', '+' и '?'все квалификаторы жадные;они соответствуют как можно большему количеству текста.Иногда такое поведение нежелательно;если RE <.*> сопоставлено с '<a> b <c>', оно будет соответствовать всей строке, а не только '<a>'.Добавление?после того, как квалификатор заставляет его провести матч не жадным или минимальным образом;будет найдено как можно меньше символов.Использование RE <.*?> будет соответствовать только '<a>'.

Поскольку . соответствует любому символу, включая \, вам необходимо заменить .+ на .+?

Другой вариант - изменить . на что-то, что лучше отражает, какие символы должны быть сопоставлены.Каждое имя организации и репозитория, о котором я знаю, содержит только буквенно-цифровые символы, символы подчеркивания и пробелы (которые заменяются тире в URL), так что это, вероятно, будет работать:

r'^prstatus/(?P<pk>\d+)/(?P<organization>[\w-]+)/(?P<repository>[\w-]+)/(?P<pr>\d+)/$'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...