¿Cómo puedo hacer que la API remota del SDK python de Google App Engine funcione con el servidor de desarrollo local cuando el servidor está vinculado a una IP específica (no localhost)?

El uso de la API remota ( remote_api_shell.py ) funciona bien en el servidor de producción. Sin embargo, solo funciona en el servidor de desarrollo cuando el servidor de desarrollo está sirviendo en localhost . No funciona cuando el servidor se ejecuta en una IP específica (por ejemplo, dev_appserver.py --host=192.168.0.1 ).

Esto está utilizando el SDK de Python. Estoy un poco seguro de que esto funcionó en la versión 1.7.5 . No funciona en 1.7.6 o 1.8.0 .

Aquí hay un caso específico:

Ejecute el servidor y déjelo enlazar con la dirección predeterminada ( 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 

Inicie el shell de la API remota, y funciona bien:

 $ ./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> 

Sin embargo, si inicia el servidor con un host específico:

 /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 

Observe que dice el Starting API server at: http://localhost:44650 , aunque el contenido se sirve en http://192.168.0.1:8080 . ¿Es esto indicativo de que solo puede ejecutar la API remota en localhost? Quizás por razones de seguridad?

Además, cuando prueba el remote_api_shell.py ahora, solo puede iniciar sesión con una cuenta válida (no se permiten cuentas falsas) e inmediatamente se produce un error y termina.

Los errores de la consola terminan con:

 urllib2.HTTPError: HTTP Error 200: OK 

y las salidas del servidor de desarrollo local:

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

Alguien sabe lo que está pasando aquí?
¿Es imposible acceder a la API remota que no sea en localhost ?
¿Es imposible acceder a la API remota (incluso en localhost ) si su contenido se sirve en una IP específica?

Parece que el servidor api no tiene opción de configurar el host. dev_appserver.py tiene opciones para configurar el host y el puerto para el servidor de contenido y administración, y para el puerto del servidor de la API solo (opción api_port ). Ejemplo:

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

Ejecutando estos informes:

  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 

Buscando en la fuente de GAE dev_appserver, el invocador del método de api_server que inicia el servidor es el módulo devappserver2.py y la línea es:

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

Puede ver el nombre de host codificado localhost .

Si no encuentra una buena solución, sugeriría parchear devappserver2.py introduciendo una nueva opción y reportando un problema con el parche adjunto .

Ahora, al menos desde la versión 1.9.27 del SDK, la opción --api_host ayuda con eso.

Solo una actualización de esto ya que la estructura de archivos GAE ha cambiado. El mío se encontraba en% ProgramFiles% \ Google \ google_appengine \ google \ appengine \ tools \ devappserver2 \ api_server.py Dentro de este archivo, puede ver la definición del servidor 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) 

Intenté pasar el argumento del puerto a través de la GUI del GAE App Launcher, no parece funcionar en absoluto, por lo que simplemente codifiqué este puerto, de lo contrario, el puerto se está aleatorizando. y eso también podría dar lugar a errores de conexión con el servidor de api remoto.