我正在使用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 ()
答案 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应用程序的首选框架。