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