4

remote_api_shell.py在生产服务器上使用远程 api ( ) 可以正常工作。但是,它仅在开发服务器上提供服务时才在开发服务器上工作localhost。当服务器在特定 IP(例如 )上运行时,它不起作用dev_appserver.py --host=192.168.0.1

这是使用 Python SDK。我有点确定这适用于 version 1.7.5。它不适用于1.7.61.8.0

下面是一个具体案例:

运行服务器并让它绑定到默认地址 ( localhost:8080):

/path/to/dev_appserver.py myapp/app.yaml
INFO     2013-05-25 19:11:15,071 sdk_update_checker.py:244] Checking for updates to the SDK.
INFO     2013-05-25 19:11:15,323 api_server.py:152] Starting API server at: http://localhost:39983
INFO     2013-05-25 19:11:15,403 dispatcher.py:98] Starting server "default" running at: http://localhost:8080
INFO     2013-05-25 19:11:15,405 admin_server.py:117] Starting admin server at: http://localhost:8000

启动远程 API shell,它工作正常:

$ ./remote_api_shell.py -s localhost:8080
Email: x@x
Password: 
App Engine remote_api shell
Python 2.7.2+ (default, Jul 20 2012, 22:15:08) 
[GCC 4.6.1]
The db, ndb, users, urlfetch, and memcache modules are imported.
dev~furloughfun> 

但是,如果您使用指定的主机启动服务器:

/path/to/dev_appserver.py --host=192.168.0.1 myapp/app.yaml
INFO     2013-05-25 19:11:53,304 sdk_update_checker.py:244] Checking for updates to the SDK.
INFO     2013-05-25 19:11:53,554 api_server.py:152] Starting API server at: http://localhost:44650
INFO     2013-05-25 19:11:53,633 dispatcher.py:98] Starting server "default" running at: http://192.168.0.1:8080
INFO     2013-05-25 19:11:53,634 admin_server.py:117] Starting admin server at: http://localhost:8000

请注意,Starting API server at: http://localhost:44650即使内容在http://192.168.0.1:8080. 这是否表明您只能在 localhost 上运行远程 api?也许是出于安全原因?

此外,当您remote_api_shell.py现在尝试时,您只能使用有效帐户(不允许伪造帐户)登录,它会立即出错并终止。

控制台错误以:

urllib2.HTTPError: HTTP Error 200: OK

和本地开发服务器输出:

INFO 2013-05-25 19:24:06,674 server.py:528] "GET /_ah/remote_api?rtok=90927106532 HTTP/1.1" 401 57

有人知道这里发生了什么吗?
除了 on 之外是否无法访问远程 API localhost?如果您的内容在特定 IP 上提供,
是否无法访问远程 API(即使在 上)?localhost

4

3 回答 3

6

似乎 api 服务器没有设置主机的选项。dev_appserver.py具有为内容和管理服务器设置主机和端口的选项,以及仅用于 api 服务器的端口(api_port选项)。例子:

dev_appserver.py --host=192.168.5.92 
                 --admin_host 192.168.5.92 --admin_port 9000 
                 --api_port 7000 .

运行此报告:

 api_server.py:153] Starting API server at: http://localhost:7000

 dispatcher.py:164] Starting server "default" running at: http://192.168.5.92:8080

 admin_server.py:117] Starting admin server at: http://192.168.5.92:9000

查看 GAE dev_appserver 的来源,启动服务器的 api_server 方法的调用者是模块devappserver2.py,行是:

apis = api_server.APIServer('localhost', options.api_port,
                             configuration.app_id)

您可以看到硬编码的主机名localhost

如果您没有找到好的解决方法,我建议通过引入一个新选项来修补并 报告附加补丁的问题devappserver2.py

于 2013-05-25T21:07:28.207 回答
1

现在,至少从 SDK 的 1.9.27 版本开始,该选项对此有所--api_host帮助。

于 2015-10-16T17:39:46.793 回答
0

由于 GAE 文件结构已更改,因此对此进行了更新。我的位于 %ProgramFiles%\Google\google_appengine\google\appengine\tools\devappserver2\api_server.py 在此文件中,您可以看到 API 服务器的定义

class APIServer(wsgi_server.WsgiServer):
  """Serves API calls over HTTP."""

  def __init__(self, host, port, app_id):
    self._app_id = app_id
    self._host = host
    super(APIServer, self).__init__((host, port), self)

我尝试通过 GAE App Launcher 的 GUI 传递端口参数,它似乎根本不起作用,所以我只是硬编码了这个端口,否则端口是随机的。这也可能导致与远程 api 服务器的连接错误。

于 2014-01-11T02:59:03.577 回答