导航到localhost上的/ _ah / admin会产生未知的404错误

时间:2012-03-13 00:47:22

标签: google-app-engine python-2.7

我目前正在将我的GAE应用程序移植到Python 2.7并且遇到了一些令人兴奋的事情,我很快就能找到一个(Hello,别名的simplejson库!)。但是,我现在无法解释这个特殊问题。

每当我导航到管理控制台(http:// localhost:8080 / _ah / admin)时,我都会得到一个404页面。这本身很奇怪(之前工作得很好),但它也不是我的自定义404页面。这让我觉得这是基于内置的处理程序,但我不确定是什么原因。

其他有趣的事实:

  • 我的app.yaml或其他地方没有尝试处理/_ah/.*
  • 除了通常的脚本到WSGI处理程序之外,我的app.yaml没有任何变化
  • 不使用联合登录
  • 随着时间的推移,我几乎开启了所有的内置
  • 该应用正确部署且没有问题
  • 我在OSX上使用GAE Launcher(轻微,但确实有一些奇怪的怪癖)

更新

显示即将发布的控制台日志可能更容易。这是在应用程序完全启动后我尝试两次导航到管理页面(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

3 个答案:

答案 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路径前面加/resweb.xml中指定的任何内容的情况下工作。