Google App Engine WebApp / Python自定义404处理程序实施

时间:2012-09-18 08:44:14

标签: python google-app-engine web-applications

我正在使用GAE,Google App Engine和使用Python的Web应用程序。

我一直在尝试实现自定义错误处理程序或模板,或者沿着这些行。 GAE提供了一些文档here,但它在实现示例中没有提供足够的文档(对我而言)。

我还在另一个StackOverflow问题here上查看了所有这些精彩示例 - 但无法理解如何将其实现到我当前的 main.py 文件中。

import os
from google.appengine.ext import webapp
from google.appengine.ext.webapp import util
from google.appengine.ext.webapp import template

class MainHandler(webapp.RequestHandler):
 def get (self, q):
    if q is None:
      q = 'static/index.html'

    path = os.path.join (os.path.dirname (__file__), q)
    self.response.headers ['Content-Type'] = 'text/html'
    self.response.out.write (template.render (path, {}))

def main ():
  application = webapp.WSGIApplication ([('/(.*html)?', MainHandler)], debug=False)
  util.run_wsgi_app (application)

if __name__ == '__main__':
  main ()

我尝试过制作另一个类,并在MainHandler之前实现它,并在def中实现新的MainHandler。我唯一能够显示404,它会全局显示,这意味着即使index.html文件也是“404”。

我尝试过的最后一件事就是实现以下几点:

if not os.path.exists (_file_):
 self.redirect(/static/error/404.html)

我的 app.yaml 文件是:

application: appname
version: 1
runtime: python
api_version: 1

error_handlers:
  - file: static/error/404.html

  - error_code: over_quota
    file: static/error/404.html

handlers:
- url: /(.*\.(gif|png|jpg|ico|js|css))
  static_files: \1
  upload: (.*\.(gif|png|jpg|ico|js|css))

- url: /robots.txt
  static_files: robots.txt
  upload: robots.txt 

- url: /favicon.ico
  static_files: favicon.ico
  upload: favicon.ico    

- url: .*
  script: main.py

我找不到404处理程序实现的任何指南/教程,只是代码提取。

非常感谢所有人!

编辑: 根据以下Hans的澄清,我想在文件系统中没有文件(或目录)时返回404.

我试过了:

class ErrorHandler(webapp.RequestHandler):
  def get(self):
     if not os.path.isfile(_file_):
        self.redirect('/static/error/404.html')

无济于事。什么是正确的实现/语法?

编辑: 到Voscausa

import os
from google.appengine.ext import webapp
from google.appengine.ext.webapp import util
from google.appengine.ext.webapp import template
import logging

import webapp2

def handle_404(request, response, exception):
    logging.exception(exception)
    response.write('Oops! I could swear this page was here!')
    response.set_status(404)

def handle_500(request, response, exception):
    logging.exception(exception)
    response.write('A server error occurred!')
    response.set_status(500)

app = webapp2.WSGIApplication([
    webapp2.Route('/', handler='handlers.HomeHandler', name='home')
])
app.error_handlers[404] = handle_404
app.error_handlers[500] = handle_500

class MainHandler(webapp.RequestHandler):
  def get (self, q):
    if q is None:
      q = 'static/index.html'

    path = os.path.join (os.path.dirname (__file__), q)
    self.response.headers ['Content-Type'] = 'text/html'
    self.response.out.write (template.render (path, {}))

def main ():
  application = webapp.WSGIApplication ([('/(.*html)?', MainHandler)], debug=True)
  util.run_wsgi_app (application)

if __name__ == '__main__':
  main ()

2 个答案:

答案 0 :(得分:0)

解决方案1:让appengine处理您的静态文件

您可以让GAE为您处理静态文件,如下所示:

application: appname
version: 1
runtime: python
api_version: 1

handlers:
- url: /static
  static_dir: static

- url: .*
  script: main.py

这样做更好,因为在为您完成服务时,提供静态文件会更容易,而且对于您的CPU配额也不会太多。

只有一个警告。如果在/static下面找不到文件,则无法指定处理的自定义错误。一旦处理程序选择了一个url,它就会尝试完成请求。如果静态目录处理程序找不到该URL,则它不会将控制权交还给main.py,这现在是您的通配符解决方案。它只会从appengine返回默认的404错误页面。

解决方案2:从您的应用程序提供静态文件

如果真的必须为您的静态创建自定义 404页面,则必须在您的应用程序中执行此操作。 (我不建议你这样做,如果不清楚的话。)在那种情况下,你走在正确的轨道上。您应该在示例中创建一个额外的处理程序。只需重写一行:

path = os.path.join(os.path.dirname(__file__), 'static', q)

在您的应用程序行中,像这样添加您的处理程序:

('/static/(.*)?', MainHandler),

如果找不到该文件,则应调用self.response.set_status(404)并编写所需的任何自定义响应消息。

答案 1 :(得分:0)

请查看:http://webapp-improved.appspot.com/guide/exceptions.html以处理404和500例外。 Webapp2现在是GAE python应用程序的首选框架。