2011-12-12 4 views
2

나는 webapp2 라우팅이 쉬울 것이라고 기대했지만 분명히 (나를 위해) 그렇지 않았다.webapp2 routing 실패

이 코드는 webapp2 route fails과 비슷하지만 코드가 거의 동일하지만 webapp2.Route를 사용할 때 404 오류가 발생하고 라우팅 지연을 사용할 때 (위에서 언급 한 다른 문제의 해결책 인 경우) 나는 이 다채로운 오류 메시지가 :

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를 사용할 수 있다면 좋을 텐데 때문에 추가 기능이 가져다 (예 : 이름). 그러나 그것은 나를 위해 일하는 것 같지 않습니다. 즉이 내 코드는 모습입니다 같은 :

애플리케이션 제목 (webapp2.Route와)

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

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> 

? 어떤 도움이나 제안도 대단히 감사합니다 !! 감사!

답변

6

여기에/당신은 또한 단순히

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

을 추가하여, 경로 이름을 얻을 수 있으며 더 PARAMS이있을 때라는 이름의 경로는 일반적으로 도움이

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

당신의 URL을 잡기 위해 올바른 정규식, 그리고 가능한 한 코드를 깨끗하게 유지하는 것을 선호합니다. 난 당신이있어 볼 수까지 (내가 내 옆에없는,하지만 난 GAE 자극의 ENV를 사용하는 - 그래서, 예를 들어

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

는 역 추적에 관한

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

을 반영 dev)이므로 webapp2를 최신 버전으로 업데이트하고 app.yaml에 정의 된 것과 동일한 py 버전으로 코드를 실행하십시오.

HTH.

+0

고마워요! 그게 내 문제를 해결해 줬어. 추적에 관해서는, 내 기본 핸들러의 __init__에 * args 및 ** kwargs가 누락되어 있었기 때문에 이것은 내 편이 어리석은 실수였습니다. 당신의 도움을 주셔서 감사합니다! – reallife