Сбой маршрутизации webapp2 - PullRequest
       8

Сбой маршрутизации webapp2

2 голосов
/ 13 декабря 2011

Я надеялся, что маршрутизация webapp2 будет легкой, но, видимо, это не так (для меня).

Эта проблема похожа на ошибка webapp2: , поскольку код почти такой же, но когда я использую webapp2.Route, я получаю только 404 ошибки и когда я использую маршрутизацию laze (как это решение в другой вопрос, упомянутый выше) я получаю это красочное сообщение об ошибке:

ERROR    2011-12-12 17:09:25,996 wsgi.py:186]
Traceback (most recent call last):
  File "/home/user/sdk/google_appengine/google/appengine/runtime/wsgi.py", line 174, in Handle
    result = handler(self._environ, self._StartResponse)
  File "/home/user/sdk/google_appengine/lib/webapp2/webapp2.py", line 1519, in __call__
    response = self._internal_error(e)
  File "/home/user/sdk/google_appengine/lib/webapp2/webapp2.py", line 1511, in __call__
    rv = self.handle_exception(request, response, e)
  File "/home/user/sdk/google_appengine/lib/webapp2/webapp2.py", line 1505, in __call__
    rv = self.router.dispatch(request, response)
  File "/home/user/sdk/google_appengine/lib/webapp2/webapp2.py", line 1253, in default_dispatcher
    return route.handler_adapter(request, response)
  File "/home/user/sdk/google_appengine/lib/webapp2/webapp2.py", line 1076, in __call__
    handler = self.handler(request, response)
TypeError: __init__() takes exactly 1 argument (3 given)
INFO     2011-12-12 17:09:26,061 dev_appserver.py:2753] "GET / HTTP/1.1" 500 -
INFO     2011-12-12 17:09:26,606 dev_appserver.py:2753] "GET /favicon.ico HTTP/1.1" 200 -

Было бы неплохо, если бы я мог использовать webapp2.Route из-за дополнительных функций, которые он приносит (например, присвоение имен). Тем не менее, кажется, ни один не работает для меня. Вкратце так выглядит мой код:

app.yaml

application: test-app
version: 1
runtime: python27
api_version: 1
threadsafe: true

handlers:
- url: /favicon\.ico
  static_files: static/images/favicon.ico
  upload: static/images/favicon\.ico

- url: .*
  script: main.site_app
  login: required

libraries:
- name: django
  version: "1.2"

main.py

import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'

import webapp2
import urls

site_app = webapp2.WSGIApplication(urls.SITE_URLS, debug=True)

urls.py (с webapp2.Route)

import webapp2

import handler

SITE_URLS = [
  webapp2.Route(r'^/$', handler.TestHome),
  webapp2.Route(r'^/test/(\w+)$', handler.TestPage)
]

urls.py (с отложенной маршрутизацией webapp2)

import handler

SITE_URLS = [
  ('/', handler.TestHome),
  ('/test/(\w+)', handler.TestPage)
]

handler.py

import os
import webapp2
from google.appengine.ext.webapp import template

class TestHome(webapp2.RequestHandler):

  def get(self):
    self.response.write(template.render(
        os.path.join(os.path.dirname(__file__), 'templates/browse.html'), {}
      )
    )


class TestPage(webapp2.RequestHandler):

  def get(self, test_key):
    self.response.write(template.render(
        os.path.join(os.path.dirname(__file__), 'templates/browse.html'),
        {'test_key': test_key}
      )
    )

шаблоны / browse.html

<html>
<head>
  <title>Success!</title>
</head>
<body>
Success!
{% if test_key %}- {{ test_key }}{% endif %}
</body>
</html>

Что я делаю не так? Любая помощь / предложения с благодарностью! Спасибо!

1 Ответ

6 голосов
/ 13 декабря 2011

вот правильное регулярное выражение, чтобы поймать ваши URL

SITE_URLS = [
    webapp2.Route(r'/', handler.TestHome),
    webapp2.Route(r'/test/<:\w+>', handler.TestPage)
]

Вы также можете получить именованный маршрут, просто добавив

 webapp2.Route(r'/test/<your_route_name_here:\w+>', handler.TestPage)

и именованные маршруты обычно полезны, когда у вас больше параметров и / или вы предпочитаете, чтобы ваш код был максимально чистым. так, например

webapp2.Route(r'/test/<category:\w+>/<user_id>/<day:\d+>', handler.TestPage)

1010 * отражает *

class TestPage(webapp2.RequestHandler):
    def get(self, category, user_id, day):
        ...

относительно этой трассировки - у меня она не на моей стороне, но я использовал GAE prod env (насколько я вижу, вы на dev), поэтому попробуйте обновить webapp2 до последней версии и убедитесь, что вы запускаете код на той же версии Py, как определено в app.yaml

НТН.

...