Google App Engine i Błąd 404

Skonfigurowałem statyczną stronę internetową na GAE, używając podpowiedzi znalezionych gdzie indziej, ale nie mogę dowiedzieć się, jak zwrócić błąd 404. Moja aplikacja.plik yaml wygląda jak

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

- url: /
  static_dir: static

Ze wszystkimi statycznymi plikami html / jpg przechowywanymi w katalogu statycznym. Powyższe działa dla plików, które istnieją, ale zwraca plik null długości, jeśli nie. odpowiedź jest prawdopodobnie napisać skrypt Pythona, aby zwrócić błąd 404, ale jak skonfigurować rzeczy do obsługi plików statycznych, które istnieją, ale uruchomić skrypt dla plików, które nie?

Oto log z pobierania nieistniejącego pliku (nosuch.html) na serwerze aplikacji deweloperskiej:

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 -
Author: Aaron Harun, 2008-10-10

9 answers

Musisz zarejestrować catch-all script handler. Dołącz to na końcu aplikacji.yaml:

- url: /.*
  script: main.py

W main.py musisz umieścić ten kod:

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

Zastąp {[2] } czymś znaczącym. Albo lepiej użyć szablonu, możesz przeczytać jak to zrobić tutaj .

Proszę dać mi znać, jeśli masz problemy z ustawieniem tego.

 37
Author: Alexander Kojevnikov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-10 02:36:02

Google app engine ma teraz niestandardowe odpowiedzi na Błędy

Więc możesz teraz dodać sekcję error_handlers do swojej aplikacji.yaml, jak w tym przykładzie:

error_handlers:

- file: default_error.html

- error_code: over_quota
    file: over_quota.html
 26
Author: jonmiddleton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-04 00:31:10

Znacznie prostszym sposobem, aby to zrobić bez konieczności wykonywania żadnych cykli procesora, jest umieszczenie tej obsługi na dole aplikacji.yaml

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

To pozwala na umieszczenie statycznego 404.plik html w katalogu views. Nie ma potrzeby obsługi Pythona. Wszystko, co nie jest obsługiwane w Twojej aplikacji.yaml już to zrobi.

 5
Author: Zee Spencer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-13 03:08:55

Możesz utworzyć funkcję do obsługi błędów dla dowolnego kodu stanu. Masz przypadek 404, zdefiniuj taką funkcję:

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

Możesz przekazać wszystko-HTML / zwykły tekst / szablony w funkcji response.out.write. Teraz dodaj następującą deklarację po app deklaracji.

app.error_handlers[404] = Handle404

To mi pomogło.
 4
Author: theG33k,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-03 14:15:52

webapp2 dostarcza słownik error_handlers, którego możesz użyć do obsługi niestandardowych stron błędów. Przykład poniżej:

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

Więcej Szczegółów jest dostępnych na stronach webapp2 dokumentacji: http://webapp-improved.appspot.com/guide/app.html#error-handlers

 3
Author: Romain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-03 15:38:51

Dev_appserver zwraca już 404 odpowiedzi na wszystko, co nie pasuje do mapowania lub pasuje do mapowania, ale nie istnieje. Odpowiedź 404 sama w sobie nie ma ciała, ale nadal jest to 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).

Jeśli chcesz zwrócić bardziej przyjazną dla użytkownika stronę błędu, postępuj zgodnie z radami jonmiddletona i określ niestandardową stronę 404.

 2
Author: Nick Johnson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-28 09:56:02

Przejrzałem wszystkie powyższe odpowiedzi i użyłem poniższego na końcu jako najbardziej uniwersalnego rozwiązania 404:

Dodaj ten link na końcu app.yaml

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

I utworzyć {[3] } o następującej treści

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)

Wyświetli zawartość pliku 404.html z kodem błędu 404.

Zaletą tego rozwiązania jest prostota, poprawność działania i elastyczność, ponieważ pozwala na wykorzystanie statycznego pliku 404.html jako zawartości strony błędu.

Ja też chcę ostrzegaj przed niektórymi z proponowanych powyżej rozwiązań.

  • Custom Error Responses nie pracuj z błędem 404
  • Nie używaj również plików statycznych, ponieważ zwracałyby one błąd 200 zamiast 404. To może powodować dużo bólu głowy przed sobą.
 2
Author: husayt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-04 01:06:44

Nie mogę skomentować odpowiedzi jonmiddletona, ale niestandardowe odpowiedzi na błędy dotyczą błędów specyficznych dla silnika aplikacji. Nie widzę sposobu na określenie niestandardowej strony 404.

Django let ' s you Określ jeden choć.

 0
Author: zahanm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-01 21:47:10

Moje podejście polega na obsłudze zarówno 404, jak i stałych przekierowań w catch all handler, który umieściłem jako ostatni. Jest to przydatne, gdy przeprojektowuję i app i zmieniam nazwy / zastępuję adresy 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
Author: JackNova,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-13 08:13:53