Значение по умолчанию с обработчиком WSGIApplication?

#python #google-app-engine

#python #google-app-engine

Вопрос:

У меня есть следующий код:

 class MyHandler(webapp.RequestHandler):
    def get(self, page_text, page=1): # page default value is 1, but it doesn't work

application = webapp.WSGIApplication([('/something/(page(d ))?/?', MyHandler)], debug=True)
  

Он должен захватывать URL-адреса, такие как:

 /something/
/something/page1
/something/page1/
/something/page2
/something/page2/
/something/pageN
/something/pageN/
  

Когда используется первый URL-адрес ( /something/ ), я все еще ожидаю, что он будет page равен 1, но на самом деле page равен None . Почему так происходит?

Ответ №1:

Просто обходной путь, ожидающий ответа гуру регулярных выражений:

 class MyHandler(webapp.RequestHandler):
    def get(self, page_text = None, page = 1)

application = webapp.WSGIApplication([('/something/', MyHandler)
                                     ('/something/(page(d ))?/?',MyHandler)], 
                                     debug=True)
  

Комментарии:

1. Теперь page всегда равно 1 (например. когда URL /something/page2 -адрес )

2. Я думаю, вам следует заменить ?/? с помощью / .

3. @daemonfire300, похоже, SO снова удалил ваш код. Попробуйте пометить это как the code , чтобы оно отображалось как есть.

4. Это правильный подход, вместо того, чтобы возиться с регулярными выражениями с переменным числом захваченных групп. Просто измените второе регулярное выражение, чтобы удалить внешние скобки и вопросительные знаки.

5. @Nick, не могли бы вы пояснить, почему это правильный подход? Зачем мне нужно иметь два элемента в webapp.WSGIApplication для одного обработчика? Решит ли это проблему со значениями по умолчанию?

Ответ №2:

Вот почти идентичная структура, которую я использую, и я рекомендую ее:

 class PageHandler(BaseHandler):
  def get(self, page_id):

('/page/([0-9] )', PageHandler),
  

Я точно не отвечаю на вопрос, но поскольку я очень доволен этим, и он может делать то, что вы хотите (страницы с идентификационными номерами), вы можете найти это полезным.