Question

J'ai créé un site Web statique sur GAE à l'aide d'indices trouvés ailleurs, mais je ne vois pas comment renvoyer une erreur 404. Mon fichier app.yaml ressemble à

- url: (.*)/
  static_files: static\1/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 existants, mais retourne un fichier de longueur NULL s'ils ne le font pas. La solution consiste probablement à écrire un script python pour renvoyer une erreur 404, mais comment configurer les choses pour servir les fichiers statiques existants tout en exécutant le script pour les fichiers qui ne le sont pas?

Voici le journal de récupération d'un fichier non existant (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 -
Était-ce utile?

La solution

Vous devez enregistrer un gestionnaire de script fourre-tout. Ajoutez ceci à la fin de votre app.yaml:

- url: /.*
  script: main.py

Dans main.py, vous devrez 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()

Remplacez <Your 404 error html page> par quelque chose de significatif. Si vous préférez utiliser un modèle, vous pouvez savoir comment cliquer ici .

Faites-moi savoir si vous rencontrez des problèmes pour l’installer.

Autres conseils

Le moteur d'applications de Google a désormais les réponses d'erreur personnalisées

afin que vous puissiez maintenant ajouter une section error_handlers à votre app.yaml, comme dans cet exemple:

error_handlers:

- file: default_error.html

- error_code: over_quota
    file: over_quota.html

Une façon beaucoup plus simple de le faire sans recourir à aucun cycle de processeur consiste à placer ce gestionnaire au bas de votre application.yaml

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

Ceci vous permet ensuite de placer un fichier statique 404.html dans votre répertoire de vues. Pas besoin d'un gestionnaire de python. Tout ce qui n’est pas déjà traité dans votre application.yaml le fera déjà.

Vous pouvez créer une fonction pour gérer vos erreurs pour n’importe quel code d’état. Vous êtes en train d'être 404, définissez une fonction comme ceci:

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

Vous pouvez tout transmettre - HTML / texte brut / modèles dans la fonction response.out.write. Ajoutez maintenant la déclaration suivante après votre app déclaration.

app.error_handlers[404] = Handle404

Cela a fonctionné pour moi.

webapp2 fournit le error_handlers dictionnaire que vous pouvez utiliser pour afficher des pages d'erreur personnalisées. 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 les pages de documentation de <=>: http : //webapp-improved.appspot.com/guide/app.html#error-handlers

Le serveur dev_appserver renvoie déjà 404 réponses pour tout ce qui ne correspond pas au mappage ou qui correspond au mappage mais n'existe pas. La réponse 404 elle-même n'a pas de corps, mais reste une 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 souhaitez retourner une page d'erreur plus conviviale, suivez les conseils de jonmiddleton et spécifiez une page 404 personnalisée.

J'ai examiné toutes les réponses données ci-dessus et utilisé les solutions suivantes à la fin de la solution 404 la plus universelle:

Ajouter ce lien à la fin de app.yaml

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

et créez 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 du 404.html fichier avec le code d'erreur 404.

L’avantage de cette solution est la simplicité, la correction du comportement et la flexibilité, car elle permet d’utiliser un fichier Custom Error Responses statique en tant que contenu de page d’erreur.

Je souhaite également mettre en garde contre certaines des solutions suggérées ci-dessus.

  • <=> ne fonctionne pas avec l'erreur 404
  • N'utilisez pas non plus de fichiers statiques, car ils renverraient une erreur 200 au lieu d'une erreur 404. Cela peut causer beaucoup de maux de tête.

Je ne peux pas commenter la réponse de jonmiddleton, mais les réponses d'erreur personnalisées concernent les erreurs spécifiques au moteur d'application, à la lecture de celles-ci. Je ne vois pas comment spécifier une page 404 personnalisée.

Django vous permet de spécifier un.

Mon approche consiste à gérer à la fois les redirections 404 et permanentes dans un gestionnaire catch all que je mets en dernier. C’est utile lorsque je modifie l’application et que je renomme / substitue des 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))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top