在不同的端口上使用dev_appserver.py运行多个服务

use*_*455 9 python google-app-engine dev-appserver-2

我有一个具有休息终点和Web终点的应用程序.

我想使用dev_appserver.py在本地运行REST和WEB服务

我尝试了以下内容

dev_appserver.py rest_app.yaml --port=5010 --admin_port=8000

dev_appserver.py web_app.yaml --port=5011 --admin_port=8001

我在其中一项服务上看到以下错误(休息服务)

`OperationalError: database is locked`
Run Code Online (Sandbox Code Playgroud)

我是否必须做任何特别的事情以确保这些服务可以在没有任何条件的情况下读取/写入共享数据库(或类似的坏事!!)

我的目标是在本地运行多个服务(在这种情况下是休息和Web),这些服务应该是数据.最好的方法是什么(在本地使用dev_appserver.py)和GAE本身(这将在我将应用程序推送到GAE时出现:D)

Dan*_*scu 12

你得到的原因OperationalError: database is locked是2个dev_appserver.py实例将碰撞尝试访问相同的数据库本地存储目录,默认情况下是根据应用程序的名称确定的 - 对于同一个应用程序的2个服务是相同的.

避免这种冲突的一种方式是同时指定本地存储目录中,使用 dev_appserver.py--storage_path可选参数(您可以通过看dev_appserver.py --help):

--storage_path PATH   path to the data (datastore, blobstore, etc.)
                      associated with the application. (default: None)
Run Code Online (Sandbox Code Playgroud)

但是,使用2个不同的存储路径可能会产生意外结果 - 如果您的服务引用该存储中应该是相同信息的内容,则可能会看到不同的值.

dev_appserver.py与同一应用程序的多个服务一起使用的正确方法是通过单个dev_appserver.py实例运行所有服务,这将为每个服务分配不同的端口.

例如,我有一个包含3个服务并使用调度文件的应用程序.这是我从app dir调用开发服务器的方式,它是3个服务目录的父目录(调度文件必须是.yaml文件args 列表中的第一个,我总是跟着默认模块的一个,在我的案例main/main.yaml):

/usr/bin/python2.7 /usr/local/google_appengine/dev_appserver.py --host 0.0.0.0 --log_level=debug dispatch.yaml main/main.yaml buildin/buildin.yaml apartci/apartci.yaml
Run Code Online (Sandbox Code Playgroud)

这就是devserver如何自动分配每个服务侦听的端口,在服务器启动时显示:

INFO     2016-11-18 14:20:53,329 api_server.py:205] Starting API server at: http://localhost:40310
INFO     2016-11-18 14:20:53,330 dispatcher.py:185] Starting dispatcher running at: http://0.0.0.0:8080
INFO     2016-11-18 14:20:53,345 dispatcher.py:197] Starting module "default" running at: http://0.0.0.0:8081
INFO     2016-11-18 14:20:53,353 dispatcher.py:197] Starting module "buildin" running at: http://0.0.0.0:8082
INFO     2016-11-18 14:20:53,361 dispatcher.py:197] Starting module "apartci" running at: http://0.0.0.0:8083
INFO     2016-11-18 14:20:53,362 admin_server.py:116] Starting admin server at: http://localhost:8000
Run Code Online (Sandbox Code Playgroud)