9

我有一个具有休息端点和网络端点的应用程序。

我想使用 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`

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

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

4

1 回答 1

13

您得到的原因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)

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

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

例如,我有一个包含 3 个服务并使用调度文件的应用程序。这就是我从应用程序目录调用开发服务器的方式,该应用程序目录是 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

这就是 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
于 2016-11-18T14:50:05.210 回答