我有一个具有休息终点和网络终点的应用程序。
我想使用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)
答案 0 :(得分:11)
您获得OperationalError: database is locked
的原因是2个dev_appserver.py
实例会在尝试访问同一个数据库本地存储目录时发生冲突,默认情况下会根据应用确定#&# 39; s名称 - 相同应用程序的2个服务相同。
避免此类冲突的一种方法是使用dev_appserver.py
--storage_path
可选参数(您可以通过dev_appserver.py --help
查看)指定本地存储目录:< / p>
--storage_path PATH path to the data (datastore, blobstore, etc.)
associated with the application. (default: None)
但是,使用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
这就是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