#google-app-engine #url-mapping
#google-app-engine #сопоставление URL-адресов
Вопрос:
возьмите этот пример из документов Google
class BrowseHandler(webapp.RequestHandler):
> def get(self, category, product_id):
> # Display product with given ID in the given category.
>
>
> # Map URLs like /browse/(category)/(product_id) to
> BrowseHandler. application =
> webapp.WSGIApplication([(r'/browse/(.*)/(.*)',
> BrowseHandler)
> ],
> debug=True)
>
> def main():
> run_wsgi_app(application)
>
> if __name__ == '__main__':
> main()
Как я могу изменить группировки regx, чтобы идентификатор продукта был необязательным
т.е. URL http://yourdomain.com/category будет отправлено обработчику просмотра в текущем примере выше, вы должны добавить идентификатор продукта или, по крайней мере, / после категории
ie
http://yourdomain.com/category/
r’/browse/(.)/(.)’
Есть идеи?
Ответ №1:
Вы можете использовать два регулярных выражения, сопоставленных одному и тому же обработчику:
class BrowseHandler(webapp.RequestHandler):
def get(self, category, product_id=None):
# Display product with given ID in the given category.
# Map URLs like /browse/(category)/(product_id) to
BrowseHandler. application =
webapp.WSGIApplication([(r'/browse/(.*)/(.*)', BrowseHandler),
(r'/browse/(.*)', BrowseHandler),
], debug=True)
def main():
run_wsgi_app(application)
if __name__ == '__main__':
main()
Комментарии:
1. Это решение работает, но сопоставления должны выполняться в обратном порядке — простая ошибка. (r’/(.*)/(.*)’, ns_cardHandler), (r’/(.*)’, ns_cardHandler) работает корректно!
2. что, если бы я захотел выбрать mime-тип, скажем path.html или path.rss или path.json итак, в моем обработчике я мог бы иметь def get (self, category, product_id = None, mime): таким образом, допустимый путь может быть tv/1010.html Могу ли я использовать этот regx и передать его в обработчик?
Ответ №2:
Попробуйте добавить «?» перед концом вашего регулярного выражения:
r'/browse/(.)/(.)?'
Комментарии:
1. Нет, это не работает, выдает ошибку в app engine python — также мне нужно, чтобы / (.*) был необязательным, решение Jbochi будет работать, поскольку для 1-го regx требуется только один аргумент. Можно ли это сделать с помощью одного выражения?