Требуется справка по сопоставлению URL-адресов Google App Engine с использованием WSGIAppl и группировки регулярных выражений

#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 требуется только один аргумент. Можно ли это сделать с помощью одного выражения?