我目前正在将我的GAE应用程序移植到Python 2.7并且遇到了一些令人兴奋的事情,我很快就能找到一个(Hello,别名的simplejson库!)。但是,我现在无法解释这个特殊问题。
每当我导航到管理控制台(http:// localhost:8080 / _ah / admin)时,我都会得到一个404页面。这本身很奇怪(之前工作得很好),但它也不是我的自定义404页面。这让我觉得这是基于内置的处理程序,但我不确定是什么原因。
其他有趣的事实:
更新
显示即将发布的控制台日志可能更容易。这是在应用程序完全启动后我尝试两次导航到管理页面(IO错误很可爱,只在初始时间发生):
[Master] [dev_appserver_multiprocess.py:650] INFO Running application mygaeapp on port 8081: http://localhost:8081
[Master] [dev_appserver_multiprocess.py:652] INFO Admin console is available at: http://localhost:8081/_ah/admin
[Master] [dev_appserver_multiprocess.py:901] DEBUG balancer to port 9000
[App Instance] [0] [py_zipimport.py:139] WARNING Can't open zipfile /Library/Python/2.7/site-packages/slimmer-0.1.30-py2.7.egg: IOError: [Errno 13] file not accessible: '/Library/Python/2.7/site-packages/slimmer-0.1.30-py2.7.egg'
[App Instance] [0] [py_zipimport.py:139] WARNING Can't open zipfile /Library/Python/2.7/site-packages/NoseGAE-0.2.0-py2.7.egg: IOError: [Errno 13] file not accessible: '/Library/Python/2.7/site-packages/NoseGAE-0.2.0-py2.7.egg'
[App Instance] [0] [recording.py:372] INFO Saved; key: __appstats__:012400, part: 67 bytes, full: 8780 bytes, overhead: 0.000 + 0.007; link: http://localhost:8081/_ah/stats/details?time=1331638312442
[App Instance] [0] [dev_appserver.py:2865] INFO "GET /_ah/admin HTTP/1.1" 404 -
[Master] [dev_appserver_multiprocess.py:901] DEBUG balancer to port 9000
[App Instance] [0] [recording.py:372] INFO Saved; key: __appstats__:020100, part: 67 bytes, full: 9196 bytes, overhead: 0.000 + 0.007; link: http://localhost:8081/_ah/stats/details?time=1331638320129
[App Instance] [0] [dev_appserver.py:2865] INFO "GET /_ah/admin HTTP/1.1" 404 -
[Master] [dev_appserver_multiprocess.py:901] DEBUG balancer to port 9000
答案 0 :(得分:7)
如果您找到此答案并且使用的是App Engine SDK 1.7.6或更高版本,则默认网址已从localhost:8080/_ah/admin
更改为localhost:8000
。
答案 1 :(得分:1)
所以我最终将它追溯到Python 2.5中完全正常的东西,但仅在dev_appserver上打破了Python 2.7。
要打开和关闭维护模式,我们通过直接更改app.router
字段来重新分配WSGI实例中的路由以指向一组新URL。通过检查应用版本来禁用此代码路径可以使/_ah/admin
正常工作。
答案 2 :(得分:0)
由于我在web.xml
文件中定义了一个网址过滤器,我遇到了同样的问题:
<filter>
<filter-name>filter</filter-name>
<filter-class>com.example.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
过滤器类MyFilter
具有doFilter
方法,如下所示:
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
String path = req.getRequestURI().substring(req.getContextPath().length());
if (path.equals("/")) { // Welcome path
request.getRequestDispatcher("/res/index").forward(request, response);
} else if (path.startsWith("/static") || path.startsWith("/_ah")) {
// Static content or internal and admin stuff
chain.doFilter(request, response); // Goes to default servlet.
} else { // Jersey servlet controller
request.getRequestDispatcher("/res" + path).forward(request, response);
}
}
上面代码中的部分|| path.startsWith("/_ah")
解决了我的问题,因为过滤器必须允许以/_ah
开头的路径不变。
我需要过滤器,以便Jersey可以在我的所有REST路径前面加/res
或web.xml
中指定的任何内容的情况下工作。