2013-04-11 2 views
3

Я пытаюсь использовать движок Google с помощью python27.Google App Engine (Python) app.yaml urlhandler не работает

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

    - url: /hello 
     script: helloworld.app 

    - url: /.* 
     script: main.app 

helloworld.py и main.app имеют один и тот же код из OFFICAL документа с небольшой разницей (строка ответа).

import webapp2 
class MainHandler(webapp2.RequestHandler): 
    def get(self): 
     self.response.write('Hello world!!!') 
app = webapp2.WSGIApplication([ 
    ('/', MainHandler) 
], debug=True) 

Мой результат: 1. "~", то ответ приходит от "main.app". 2. «~/favicon.ico», ответ приходит от «favicon.ico». 3. «~/hello», ответ «404». 4. «~/something», ответ «404».

Извините, чтобы задать вопрос, «~» за "http://localhost:8080".

Почему 3 и 4 нельзя обрабатывать? Здесь что-то не так?

ответ

3

Попробуйте изменить ('/', MainHandler) на (r'/.*', MainHandler) (r просто указывает, что это необработанная строка). Проблема в том, что в настоящее время у вас нет обработчиков для чего-то другого, кроме вашего корня /, поэтому запросы с другими параметрами (например, http://localhost:8080/hello) не имеют соответствующего обработчика, и поэтому неизвестно, как с ним обращаться. Изменение обработчика на /.* означает, что все запросы (независимо от того, что происходит после корня) должны быть перенаправлены на ваш MainHandler.

Что касается app.yaml обработчиков и обработчиков в вашем файле *.py, подумайте о app.yaml как директор высокого уровня. Он получает запрос и просто определяет, куда его отправить (я получаю запрос на статический файл Javascript? CSS? Изображение? Или это запрос, который должен служить странице и т. Д.?). В случае, например, выше, вы хотите, чтобы он обслуживал конкретную страницу при попадании на любой URL-адрес, который не является /favicon (так /.*), поэтому он делает любой запрос до /.* и направляет его на main.app, который находится в вашем main.py файл (на данный момент я игнорирую helloworld.app, главным образом потому, что в вашей ситуации вам это необязательно).

Именно тогда происходит более гранулированное обращение - main.app получает исходный запрос, а затем ищет определенный обработчик для выполнения кода. Когда мы меняем обработчиков на r'/.*', он соответствует всем тем, что приходит (так что /, /hello, /helloworld и т. Д.), И в этом случае он выполняет соответствующий класс MainHandler).

+0

Большое спасибо, проблема решена. Я прочитаю кое-что для большего, узнав различия между двумя обработчиками в app.yaml и * .py. – Babeler

+0

@Babeler Нет проблем, рад, что это помогло :) Проверьте http://webapp-improved.appspot.com/guide/routing.html, который представляет собой документацию webapp2 по URL-адресу маршрутизации (вы используете инфраструктуру webapp2). Я добавил немного подробней ответ, который, надеюсь, будет полезен. Удачи во всем. – RocketDonkey

Смежные вопросы