Erreur Google App Engine et 404

j'ai mis en place un site Web statique sur GAE en utilisant des indices trouvés ailleurs, mais je n'arrive pas à trouver comment retourner une erreur 404. Mon application.fichier yaml ressemble

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

- url: /
  static_dir: static

avec tous les fichiers html/jpg statiques stockés dans le répertoire static. Ce qui précède fonctionne pour les fichiers qui existent, mais renvoie un fichier de longueur nulle s'ils n'existent pas. La réponse est probablement d'écrire un script python pour retourner une erreur 404, mais comment configurer les choses pour servir les fichiers statiques qui existent mais exécuter le script pour les fichiers qui ne l'est pas?

voici le journal de recherche d'un fichier inexistant (nosuch.html) sur le serveur d'applications de développement:

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 -
36
demandé sur Aaron Harun 2008-10-10 04:51:00

9 réponses

vous devez enregistrer un gestionnaire de script tous azimuts. Ajouter ceci à la fin de votre application.yaml:

- url: /.*
  script: main.py

Dans main.py vous aurez besoin de mettre ce code:

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

Remplacer <Your 404 error html page> avec quelque chose de significatif. Ou mieux utiliser un modèle, vous pouvez lire comment le faire ici.

s'il vous Plaît laissez-moi savoir si vous avez des problèmes de cette mise en place.

37
répondu Alexander Kojevnikov 2008-10-10 02:36:02

google app engine a maintenant Personnaliser Les Réponses D'Erreur

Vous pouvez donc maintenant ajouter une section error_handlers à votre application.yaml, comme dans cet exemple:

error_handlers:

- file: default_error.html

- error_code: over_quota
    file: over_quota.html
26
répondu jonmiddleton 2016-01-04 00:31:10

une façon beaucoup plus simple de le faire sans avoir besoin de cycles CPU est de placer ce handler au bas de votre application.yaml

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

cela vous permet alors de placer un 404 statique.fichier html dans votre répertoire de vues. Pas besoin d'un python de gestionnaire. Tout ce qui n'est pas traité dans votre application.yaml va déjà frapper ça.

5
répondu Zee Spencer 2009-05-13 03:08:55

Vous pouvez créer une fonction pour gérer vos erreurs pour l'un quelconque des codes d'état. Vous êtes cas 404, définir une fonction comme ceci:

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

Vous pouvez passer n'importe quoi - HTML / texte brut / templates dans le response.out.write fonction. Maintenant, ajoutez la déclaration suivante après votre app déclaration.

app.error_handlers[404] = Handle404

Cela a fonctionné pour moi.

4
répondu theG33k 2012-09-03 14:15:52

webapp2 offre error_handlers dictionnaire que vous pouvez utiliser pour servir des pages d'erreur personnalisées. L'exemple ci-dessous:

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

Plus de détails sont disponibles sur http://webapp-improved.appspot.com/guide/app.html#error-handlers

3
répondu Romain 2014-03-03 15:38:51

le serveur dev_appserver renvoie déjà 404 réponses pour tout ce qui ne correspond pas à la correspondance, ou ne correspond pas à la correspondance mais n'existe pas. La réponse 404 lui-même n'a pas de corps, mais c'est toujours une erreur 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).

si vous voulez retourner une page d'erreur plus conviviale, suivez les conseils de jonmiddleton et spécifiez une page 404 personnalisée.

2
répondu Nick Johnson 2010-10-28 09:56:02

j'ai passé en revue toutes les réponses données ci-dessus et j'ai utilisé ce qui suit à la fin comme la solution 404 la plus universelle:

Ajouter ce lien à la fin de app.yaml

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

et de créer 404.py avec le contenu suivant

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)

ceci affichera le contenu de 404.html fichier avec le code d'erreur 404.

l'avantage de cette solution est la simplicité, la justesse de bahaviour et la flexibilité, car elle permet d'utiliser un404.html fichier erreur de contenu de la page.

  • Custom Error Responses ne fonctionne pas avec l'erreur 404
  • N'utilisez pas non plus les fichiers statiques, car ils retourneraient 200 au lieu de 404 erreur. Cela peut causer beaucoup de maux de tête à l'avance.
2
répondu husayt 2016-01-04 01:06:44

Je ne peux pas faire de commentaire sur la réponse de jonmiddleton, mais les réponses d'erreur personnalisées sont pour les erreurs spécifiques au moteur D'application à l'apparence. Je ne vois pas comment spécifier une page 404 personnalisée.

Django nous allons vous spécifier un bien.

0
répondu zahanm 2011-03-01 21:47:10

mon approche est de gérer à la fois 404 et les redirections permanentes dans un handler catch all que j'ai mis comme le dernier. Ceci est utile lorsque je redessine et app et renommer / substituer des 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))
0
répondu JackNova 2013-06-13 08:13:53