你收到“OperationalError: database is locked”错误的原因是两个“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)
然而,使用两个不同的存储路径可能会产生意想不到的结果——如果您的服务引用了应该在该存储中相同的信息,它们可能会看到不同的值。
在使用同一应用程序的多个服务时,正确的方式是通过单个dev_appserver.py
实例运行所有服务,该实例将为每个服务分配不同的端口。
例如,我有一个具有3个服务和使用调度文件的应用程序。这是我如何从应用程序目录调用开发服务器的方法,该目录是3个服务目录的父目录(调度文件必须在.yaml
文件参数列表的第一个位置,并且我总是在其后跟随默认模块的一个,在我的情况下是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