捕获静态“找不到文件”错误
Posted
技术标签:
【中文标题】捕获静态“找不到文件”错误【英文标题】:Catch static 'file not found' errors 【发布时间】:2014-11-10 18:24:46 【问题描述】:对于这样的错误处理程序,我有一个“包罗万象”的正则表达式:
(r'/.*', errors.Error)
列在所有其他之后,以匹配“其他所有”。
当页面不存在时,这会正常失败。
不过,我也有一个静态文件目录,上传是这样的:
handlers:
- url: /files
static_dir: files
因此,如果我尝试在 /files/
中加载与该目录中现有文件不对应的 URL,我会得到:
错误:未找到
在此服务器上找不到请求的 URL。
无需单独列出要上传的每个文件,我如何才能捕获此错误;理想情况下与上述相同的处理程序errors.Error
?
【问题讨论】:
CV'ers:欢迎您的建设性 cmets.. 【参考方案1】:不幸的是,没有好的方法可以做到这一点。功能请求在这里:https://code.google.com/p/googleappengine/issues/detail?id=8380&q=type%3DFeature%20error%20404&colspec=ID%20Type%20Component%20Status%20Stars%20Summary%20Language%20Priority%20Owner%20Log
由于static_dir
中不存在文件,因此无法为 404 配置自定义处理程序或静态错误页面。如果 URL 匹配子路径下的任何内容,static_files
也是如此,相当于 static_dir
:
handlers:
- url: /files/(.*)
static_files: files/\1
upload: files/.*
URL 路径与特殊静态处理程序的 URL 模式匹配。然后静态处理程序意识到请求的文件不存在。控制不会返回到路由逻辑,也没有机会自定义静态处理程序的响应。静态处理程序只返回一个通用的 404。
如果static_files
的 URL 模式与存在的文件名完全匹配,则不匹配的 URL 路径将落入后续处理程序,包括底部的全部捕获。但这实际上是在单独列出配置文件中的所有静态文件:
handlers:
- url: /files/(foo.png|bar.js|baz.css)
static_files: files/\1
upload: files/.*
- url: .*
script: errorhandler.app
# Or for a static error page:
- url: .*
static_files: error.html
upload: error.html
同样不幸的是,error_handlers:
也无济于事,因为它还不支持自定义 404。值得注意的是,如果没有一个 handlers:
与 URL 匹配,App Engine 返回的 404 也是通用的,也无法自定义。
在不在处理程序的 URL 模式中列出静态文件名的情况下完全满足此要求的唯一方法是不使用静态文件,而是使用应用程序处理程序从应用程序文件中提供静态数据(并提供自定义 404 消息如果没有找到)。
handlers:
- url: .*
script: filehandler.app
【讨论】:
真可惜。不过,我已为功能请求加注星标,谢谢。【参考方案2】:捕获 404 就像下面这行代码一样简单
app.error_handlers[404] = handle_404
其中 handle_404 是一个处理异常的 def 方法 + 您不再需要“包罗万象”的正则表达式。
在“WSGI 应用程序中的异常”部分中查看本指南以获取更多详细信息:https://webapp-improved.appspot.com/guide/exceptions.html
还可以查看app.yaml
的error_handlers 参数。 See more here.
【讨论】:
感谢您的回答,但实际上不存在的静态文件引发了HTTPNotFound
。将此添加到 error_handlers
无效。以上是关于捕获静态“找不到文件”错误的主要内容,如果未能解决你的问题,请参考以下文章
java读取文件,报找不到文件错误,我写的路径跟报错的路径不一样,怎么回事?
Android 设备上的“找不到网页”“找不到文件:///android_asset/html-nl/index.html”错误