Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当服务器绑定到特定IP(而不是本地主机)时,如何使Google App Engine python SDK远程API与本地开发服务器协同工作?_Python_Google App Engine - Fatal编程技术网

当服务器绑定到特定IP(而不是本地主机)时,如何使Google App Engine python SDK远程API与本地开发服务器协同工作?

当服务器绑定到特定IP(而不是本地主机)时,如何使Google App Engine python SDK远程API与本地开发服务器协同工作?,python,google-app-engine,Python,Google App Engine,使用远程api(remote\u api\u shell.py)可以在生产服务器上正常工作。但是,只有当开发服务器在localhost上运行时,它才在开发服务器上工作。当服务器在特定IP上运行时(例如,dev_appserver.py--host=192.168.0.1),它不工作 这是在使用Python SDK。我敢肯定这在版本1.7.5上是有效的。它不适用于1.7.6或1.8.0 以下是一个具体案例: 运行服务器并让它绑定到默认地址(localhost:8080): 启动远程API外壳,它工

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

这是在使用Python SDK。我敢肯定这在版本
1.7.5
上是有效的。它不适用于
1.7.6
1.8.0

以下是一个具体案例:

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

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

$ ./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
注意,上面写着在以下位置启动API服务器:http://localhost:44650即使内容在
http://192.168.0.1:8080
。这是否表示您只能在本地主机上运行远程api?也许是出于安全原因

此外,当您现在尝试使用
远程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
有人知道这里发生了什么吗?
除了在
localhost
上,是否无法访问远程API?

如果您的内容在特定的IP上提供,是否无法访问远程API(即使在
localhost
)呢?

API服务器似乎没有设置主机的选项
dev_appserver.py
具有设置内容和管理服务器的主机和端口以及仅api服务器端口的选项(
api_端口
选项)。例如:

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方法的调用方是module
devappserver2.py
,行是:

apis = api_server.APIServer('localhost', options.api_port,
                             configuration.app_id)
您可以看到硬编码的主机名
localhost


如果您没有找到好的解决方法,我建议通过引入一个新选项来修补
devappserver2.py
,并且随着GAE文件结构的改变,只需对其进行更新即可。我的矿位于 %ProgramFiles%\Google\Google\U appengine\Google\appengine\tools\devappserver2\api\U 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应用程序启动器的GUI传递端口参数,它似乎根本不起作用,所以我只是硬编码了这个端口,否则端口将被随机分配。这也可能导致到远程api服务器的连接错误。

现在,至少从SDK的1.9.27版开始,选项
--api\u host
有助于实现这一点。

还有一个未记录的
--api\u host
选项,请参阅错误报告:
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)