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