38

我已经使用在其他地方找到的提示在 GAE 上设置了一个静态网站,但无法弄清楚如何返回 404 错误。我的 app.yaml 文件看起来像

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

- url: /
  static_dir: static

将所有静态 html/jpg 文件存储在静态目录下。以上适用于存在的文件,但如果不存在则返回空长度文件。答案可能是编写一个 python 脚本来返回一个 404 错误,但是你如何设置东西来为存在的静态文件提供服务,但为不存在的文件运行脚本呢?

以下是在开发应用程序服务器上获取不存在的文件 (nosuch.html) 的日志:

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 -
4

9 回答 9

37

您需要注册一个包罗万象的脚本处理程序。将此附加到 app.yaml 的末尾:

- url: /.*
  script: main.py

在 main.py 中,您需要输入以下代码:

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

换成<Your 404 error html page>有意义的东西。或者更好地使用模板,您可以在此处阅读如何执行操作。

如果您在设置时遇到问题,请告诉我。

于 2008-10-10T02:36:02.923 回答
28

谷歌应用引擎现在有自定义错误响应

所以你现在可以在你的 app.yaml 中添加一个 error_handlers 部分,如下例所示:

error_handlers:

- file: default_error.html

- error_code: over_quota
    file: over_quota.html
于 2010-09-15T21:50:05.000 回答
5

在不需要任何 CPU 周期的情况下执行此操作的一种非常简单的方法是将此处理程序放在 app.yaml 的底部

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

然后,这允许您将静态 404.html 文件放置在您的视图目录中。不需要 python 处理程序。您的 app.yaml 中未处理的任何内容都会受到影响。

于 2009-05-13T03:08:55.270 回答
4

您可以创建一个函数来处理任何状态代码的错误。你的情况是 404,定义一个这样的函数:

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

您可以在函数中传递任何内容 - HTML / 纯文本 / 模板response.out.write。现在,在您的声明之后添加以下app声明。

app.error_handlers[404] = Handle404

这对我有用。

于 2012-06-02T11:37:26.043 回答
3

webapp2提供error_handlers可用于提供自定义错误页面的字典。下面的例子:

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

更多详细信息请参见webapp2的文档页面:http ://webapp-improved.appspot.com/guide/app.html#error-handlers

于 2014-03-03T15:38:51.897 回答
2

dev_appserver 已经为与映射不匹配或匹配映射但不存在的任何内容返回 404 响应。404 响应本身没有正文,但它仍然是 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).

如果您想返回一个更用户友好的错误页面,请遵循 jonmiddleton 的建议并指定自定义 404 页面。

于 2010-10-28T09:56:02.043 回答
2

我已经查看了上述所有给出的答案,并在最后使用以下作为最通用的 404 解决方案:

在末尾添加此链接app.yaml

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

404.py使用以下内容创建

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)

这将显示404.html带有 404 错误代码的文件内容。

该解决方案的优点是简单、行为的正确性和灵活性,因为它允许使用静态404.html文件作为错误页面内容。

我还想对上面建议的一些解决方案提出警告。

  • Custom Error Responses不适用于 404 错误
  • 也不要使用静态文件,因为它们会返回 200 而不是 404 错误。这可能会导致很多头痛。
于 2016-01-04T01:06:44.697 回答
0

我无法评论 jonmiddleton 的回答,但从外观上看,自定义错误响应是针对 App 引擎特定错误的。我看不到指定自定义 404 页面的方法。

Django让你指定一个。

于 2011-03-01T21:47:10.990 回答
0

我的方法是在我放在最后一个处理程序中处理 404 和永久重定向。当我重新设计和应用程序并重命名/替换 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))
于 2013-06-13T08:13:53.567 回答