Google App Engine и ошибка 404 - PullRequest
       18

Google App Engine и ошибка 404

37 голосов
/ 10 октября 2008

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

- 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 -

Ответы [ 9 ]

37 голосов
/ 10 октября 2008

Вам необходимо зарегистрировать обработчик скриптов для всех целей. Добавьте это в конце вашего 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> чем-то значимым. Или лучше использовать шаблон, вы можете прочитать, как это сделать здесь .

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

27 голосов
/ 16 сентября 2010

Google App Engine теперь имеет Пользовательские сообщения об ошибках

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

error_handlers:

- file: default_error.html

- error_code: over_quota
    file: over_quota.html
5 голосов
/ 13 мая 2009

Значительно более простой способ сделать это, не требуя циклов ЦП, - разместить этот обработчик внизу вашего приложения.

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

Затем вы можете поместить статический файл 404.html в каталог представлений. Нет необходимости в обработчике Python. Все, что не обработано в вашем app.yaml, уже попадет в это.

4 голосов
/ 02 июня 2012

Вы можете создать функцию для обработки ваших ошибок для любого из кодов состояния. Вы случай 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

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

3 голосов
/ 03 марта 2014

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: http://webapp -improved.appspot.com / guide / app.html # обработчики ошибок

2 голосов
/ 04 января 2016

Я рассмотрел все приведенные выше ответы и в конце использовал следующее в качестве наиболее универсального решения 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. Это может вызвать много головной боли впереди.
2 голосов
/ 28 октября 2010

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 голосов
/ 13 июня 2013

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

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))
0 голосов
/ 02 марта 2011

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

Django позволяет вам указать один, хотя.

...