it-swarm.com.de

Google App Engine und Fehler 404

Ich habe eine statische Website in GAE mit Hilfe von an anderer Stelle gefundenen Hinweisen erstellt, kann jedoch nicht herausfinden, wie ein 404-Fehler zurückgegeben wird. Meine app.yaml-Datei sieht so aus

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

- url: /
  static_dir: static

mit allen statischen html/jpg-Dateien, die im statischen Verzeichnis gespeichert sind. Das Obige funktioniert für vorhandene Dateien, gibt jedoch eine Datei mit der Länge Null zurück, wenn dies nicht der Fall ist. Die Antwort ist wahrscheinlich, ein Python-Skript zu schreiben, um einen 404-Fehler zurückzugeben. Wie können Sie jedoch die statischen Dateien bereitstellen, die vorhanden sind, aber das Skript für Dateien ausführen, die dies nicht tun?

Hier ist das Protokoll vom Abrufen einer nicht vorhandenen Datei (nosuch.html) auf dem Entwicklungsanwendungsserver:

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

Sie müssen einen Catch-All-Skript-Handler registrieren. Fügen Sie dies am Ende Ihrer app.yaml an:

- url: /.*
  script: main.py

In main.py müssen Sie diesen Code eingeben:

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 __== "__main__":
    main()

Ersetzen Sie <Your 404 error html page> durch etwas Sinnvolles. Oder verwenden Sie besser eine Vorlage. Sie können lesen, wie das geht hier .

Bitte lassen Sie mich wissen, wenn Sie Probleme bei der Einrichtung haben.

37

google App Engine hat jetzt Benutzerdefinierte Fehlerantworten

sie können jetzt Ihrer app.yaml einen Abschnitt error_handlers hinzufügen, wie in diesem Beispiel:

error_handlers:

- file: default_error.html

- error_code: over_quota
    file: over_quota.html
27
jonmiddleton

Eine wesentlich einfachere Möglichkeit, dies ohne CPU-Zyklen auszuführen, besteht darin, diesen Handler unten in Ihrer app.yaml zu platzieren

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

Dadurch können Sie eine statische 404.html-Datei in Ihrem Ansichtsverzeichnis ablegen. Keine Notwendigkeit für einen Python-Handler. Alles, was nicht bereits in Ihrer app.yaml behandelt wird, wird dies treffen.

5
Zee Spencer

Sie können eine Funktion erstellen, um Ihre Fehler für einen der Statuscodes zu behandeln. Wenn Sie 404 sind, definieren Sie eine Funktion wie folgt: 

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

Sie können alles übergeben - HTML/Nur-Text/Vorlagen in der response.out.write-Funktion. Fügen Sie nun die folgende Deklaration nach Ihrer app-Deklaration ein.

app.error_handlers[404] = Handle404

Das hat für mich funktioniert.

4
theG33k

webapp2 enthält das error_handlers-Wörterbuch, mit dem Sie benutzerdefinierte Fehlerseiten bereitstellen können. Beispiel unten:

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

Weitere Informationen finden Sie auf den Dokumentationsseiten von webapp2: http://webapp-improved.appspot.com/guide/app.html#error-handlers

3
Romain

Ich habe alle oben genannten Antworten durchgesehen und am Ende als die universellste 404-Lösung Folgendes verwendet:

Fügen Sie diesen Link am Ende von app.yaml hinzu.

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

und erstellen Sie 404.py mit dem folgenden Inhalt

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)

Dadurch wird der Inhalt der 404.html-Datei mit dem Fehlercode 404 angezeigt.

Der Vorteil dieser Lösung ist die Einfachheit, die Richtigkeit des Verhaltens und die Flexibilität, da eine statische 404.html-Datei als Inhalt der Fehlerseite verwendet werden kann.

Ich möchte auch vor einigen der oben vorgeschlagenen Lösungen warnen. 

  • Custom Error Responses funktioniert nicht mit dem 404-Fehler
  • Verwenden Sie auch keine statischen Dateien, da sie 200 anstelle des 404-Fehlers zurückgeben würden. Dies kann zu erheblichen Kopfschmerzen führen.
2
husayt

Der dev_appserver gibt bereits 404 Antworten für alles zurück, was nicht mit dem Mapping übereinstimmt oder nicht mit dem Mapping übereinstimmt. Die 404-Antwort selbst hat keinen Körper, ist aber immer noch eine 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).

Wenn Sie eine benutzerfreundlichere Fehlerseite zurückgeben möchten, befolgen Sie die Anweisungen von jonmiddleton und geben Sie eine benutzerdefinierte 404-Seite an.

2
Nick Johnson

Ich kann die Antwort von jonmiddleton nicht kommentieren, aber die benutzerdefinierten Fehlerantworten sind für App Engine-spezifische Fehler, so wie sie aussehen. Ich sehe keine Möglichkeit, eine benutzerdefinierte 404-Seite anzugeben.

Django lasst uns aber angeben.

0
zahanm

Mein Ansatz ist es, sowohl 404 als auch permanente Weiterleitungen in einem Catch-All-Handler zu behandeln, den ich als letzter abgelegt habe. Dies ist nützlich, wenn ich URLs neu entwerfe und app und umbenenne/ersetze:

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
JackNova