2008-10-10 1 views
36

Я установил статический сайт на GAE, используя подсказки, найденные в другом месте, но не могу понять, как вернуть ошибку 404. Мой app.yaml файл выглядитОшибка Google App Engine и ошибка 404

- url: (.*)/ 
    static_files: static\1/index.html 
    upload: static/index.html 

- url:/
    static_dir: static 

со всеми статическими HTML/JPG файлов, сохраненных в статическом каталоге. Вышеприведенные работы для файлов, которые существуют, но возвращают файл с нулевой длиной, если они этого не делают. Ответ, вероятно, заключается в написании скрипта python для возврата ошибки 404, но как вы настроите все, чтобы обслуживать статические файлы, которые существуют, но запускать скрипт для файлов, которые этого не делают?

Вот бревно из выборки несуществующего файла (nosuch.html) на сервере приложений развития:

ERROR 2008-11-25 20:08:34,084 dev_appserver.py] Error encountered reading file "/usr/home/ctuffli/www/tufflinet/static/nosuch.html": 
[Errno 2] No such file or directory: '/usr/home/ctuffli/www/tufflinet/static/nosuch.html' 
INFO  2008-11-25 20:08:34,088 dev_appserver.py] "GET /nosuch.html HTTP/1.1" 404 - 
+1

Я бы назвал это «питон», но у меня нет доступа (пока) ... – 2009-11-11 19:03:26

ответ

37

Вы должны зарегистрировать кетчуп всех обработчик сценариев. Добавьте это в конце вашего app.yaml:

- url: /.* 
    script: main.py 

В main.py вам нужно будет поставить этот код:

from google.appengine.ext import webapp 
from google.appengine.ext.webapp.util import run_wsgi_app 

class NotFoundPageHandler(webapp.RequestHandler): 
    def get(self): 
     self.error(404) 
     self.response.out.write('<Your 404 error html page>') 

application = webapp.WSGIApplication([('/.*', NotFoundPageHandler)], 
            debug=True) 

def main(): 
    run_wsgi_app(application) 

if __name__ == "__main__": 
    main() 

Заменить <Your 404 error html page> с чем-то значимым. Или лучше использовать шаблон, вы можете прочитать, как это сделать here.

Пожалуйста, дайте мне знать, если у вас возникли проблемы с настройкой.

+0

Похоже, в последней строке в моей первоначальной app.yaml соответствует, прежде чем тот, который вы предложить добавить – ctuffli 2008-11-25 20:28:08

+0

Это работает, но Я предпочитаю, чтобы предложение Захари использовало статический обработчик для страницы 404 (см. Его ответ ниже). – 2010-04-29 19:31:34

+2

Я пытаюсь сделать это таким образом, но если я установил ошибку 404, html не будет отображаться, использую ли я шаблон или нет. – 2010-07-03 15:08:18

5

Значительно более простой способ сделать это, не требуя каких-либо циклов процессора, чтобы поместить этот обработчик в нижней части app.yaml

- url: /.* 
    static_files: views/404.html 
    upload: views/404.html 

Это то позволяет размещать статический файл 404.html в вашем просмотра. Нет необходимости в обработчике python. Все, что не обрабатывается в вашем app.yaml, уже ударит.

26

Google App Engine теперь имеет Custom Error Responses

так теперь вы можете добавить раздел error_handlers к вашему app.yaml, как в этом примере:

error_handlers: 

- file: default_error.html 

- error_code: over_quota 
    file: over_quota.html 
2

dev_appserver уже возвращающегося 404 ответов на все, что не соответствует сопоставлению или соответствует сопоставлению, но не существует. 404 сам по себе ответ не имеет тела, но это все-таки 404:

$ wget -O - http://127.0.0.1:8080/foo 
--2010-10-28 10:54:51-- http://127.0.0.1:8080/foo 
Connecting to 127.0.0.1:8080... connected. 
HTTP request sent, awaiting response... 404 
2010-10-28 10:54:51 ERROR 404: (no description). 

$ wget -O - http://127.0.0.1:8080/foo/ 
--2010-10-28 10:54:54-- http://127.0.0.1:8080/foo/ 
Connecting to 127.0.0.1:8080... connected. 
HTTP request sent, awaiting response... 404 
2010-10-28 10:54:54 ERROR 404: (no description). 

Если вы хотите вернуть более удобной страницу ошибки, следуйте советам jonmiddleton и указать пользовательский 404 страницы.

0

Я не могу комментировать ответ jonmiddleton, но пользовательские ответы об ошибках относятся к конкретным ошибкам App Engine по внешнему виду. Я не вижу способа указать пользовательскую страницу 404.

Django давайте вам specify один хотя.

4

Вы можете создать функцию для обработки ваших ошибок для любого из кодов состояния. Вы случай будучи 404, определить функцию следующим образом:

def Handle404(request, response, exception): 
    response.out.write("Your error message") 
    response.set_status(404)` 

Вы можете передать что-нибудь - HTML/обычный текст/шаблоны в функции response.out.write.Теперь добавьте следующее объявление после объявления app.

app.error_handlers[404] = Handle404

Это работает для меня.

0

Мой подход состоит в том, чтобы обрабатывать как 404, так и перманентные переадресации в улове всех обработчиков, которые я ставил как последний. Это полезно, когда я редизайн и приложение и переименовать/замещающие URLs:

app = webapp2.WSGIApplication([ 
    ... 
    ... 
    ('/.*', ErrorsHandler) 
], debug=True) 


class ErrorsHandler(webapp2.RequestHandler): 
    def get(self): 
     p = self.request.path_qs 
     if p in ['/index.html', 'resources-that-I-removed']: 
      return self.redirect('/and-substituted-with-this', permanent=True) 
     else: 
      self.error(404) 
      template = jinja_environment.get_template('404.html') 
      context = { 
       'page_title': '404', 
      } 
      self.response.out.write(template.render(context)) 
3

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

def handle_404(request, response, exception): 
    logging.warn(str(exception)) 
    response.set_status(404) 
    h = YourAppBaseHandler(request, response) 
    h.render_template('notfound') 

def handle_500(request, response, exception): 
    logging.error(str(exception)) 
    response.set_status(500) 
    h = YourAppBaseHandler(request, response) 
    h.render_template('servererror') 

app = webapp2.WSGIApplication([ 
    webapp2.Route('/', MainHandler, name='home') 
    ], debug=True) 
app.error_handlers[404] = handle_404 
app.error_handlers[500] = handle_500 

Более подробную информацию можно получить на webapp2 «s страниц документации: http://webapp-improved.appspot.com/guide/app.html#error-handlers

2

Я рассмотрел все указанные выше ответы и используются следующие в конце, как наиболее универсальный 404 решения:

Добавить эту ссылку в конце app.yaml

- url: /(.*) 
    script: 404.app 

и создать 404.py со следующим содержанием

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

class NotFound(webapp2.RequestHandler): 
    def get(self): 
    self.error(404) 
    self.response.out.write(template.render('404.html', {})) 

app = webapp2.WSGIApplication([ 
    ('/.*', NotFound) 
], debug=True) 

Это будет отображать содержимое файла 404.html с 404 кодом ошибки.

Преимущество этого решения заключается в простоте, правильности работы и гибкости, поскольку он позволяет использовать статический файл 404.html в качестве содержимого страницы с ошибками.

Я также хочу предупредить о некоторых из предложенных выше решений.

  • Custom Error Responses Дон не работает с 404 ошибкой
  • Также не используйте статические файлы, так как они вернутся 200 вместо 404 ошибки. Это может вызвать много головной боли.