Отображение URL Regex на веб-сервере торнадо
Я использую веб-сервер торнадо для моего приложения.
Ниже приведен один из URL-адресов, сопоставленных с обработчиком.
from publish.handler import PublishHandler, PublishedHandler
URLS = [(r'/public/project/(?P<project>.*?)/?$', PublishHandler),
(r'/stitchemapp-public/project/(?P<project>.*?)/version/(?P<version>v\d{1,}.*)/image/(?P<image>.*?)/$',
PublishedHandler),
]
Весь импорт и вызов обработчика происходит нормально.
Но некоторая проблема с генерированием kwargs из второго кортежа URL-адресов в списке URLS. Когда я делаю
print kwargs
это печатает:
{'project': u'clearsoup', 'version': u'v2/image/project_home_page_v1.jpg'}
Но я ожидаю:
{'project': u'clearsoup', 'version': u'v2', 'image': 'project_home_page_v1.jpg'}
Где я делаю неправильно. Я всегда могу написать хаки, чтобы получить точную информацию от kwargs, которую получает обработчик, но это не правильный путь.
Пожалуйста, предложите мне, где я делаю неправильно.
Заранее спасибо за помощь.
1 ответ
Я знаю, что это очень старо, но это так же просто, как регулярное выражение версии использует жадный квантификатор. Согласно документации Python:
"The" , "+" и "?" все квалификаторы являются жадными, они соответствуют как можно большему количеству текста. Иногда такое поведение нежелательно; если RE <. > сопоставляется с b, оно будет соответствовать всей строке, а не только. Добавление? после того, как квалификатор сделает это выполнять сопоставление не жадным или минимальным образом; будет сопоставлено как можно меньше символов. Использование RE <.*?> будет соответствовать только."
Итак, чтобы исправить, замените.* На.*?.
Вы использовали негладкий квантификатор в двух других регулярных выражениях, поэтому я думаю, что это было ошибкой.