4

我正在使用 GAE,Google App Engine 和使用 Python 的 Webapp。

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

我还在这里查看了关于另一个 StackOverflow 问题的所有这些精彩示例- 但无法理解如何将其实现到我当前的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 ()

我尝试制作另一个类,MainHandlerdefMainHandler. 我唯一一次显示 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')

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

编辑:致沃斯考萨

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

2 回答 2

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,它就会尝试完成请求。如果静态 dir 处理程序找不到 url,它不会将控制权交还给main.py,现在这是您的通配符解决方案。它只会从 appengine 返回默认的 404 错误页面。

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

如果你真的必须为你的静态创建一个自定义的404 页面,你必须在你的应用程序中进行。(我不建议你这样做,以防不清楚。)在那种情况下,你是在正确的轨道上。您应该像示例中那样创建一个额外的处理程序。改写一行:

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

在您的应用程序行中,添加您的处理程序,如下所示:

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

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

于 2012-09-18T09:00:01.540 回答
0

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

于 2012-09-18T10:13:37.210 回答