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 -
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.
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
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.
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
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
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.
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ą.
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ć.
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))
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