我一直在关注一些关于使用他们的云 SQL 和 django 设置 google app engine (GAE) 的教程。我得出的结论是,它们中的大多数都会让您安装 python 和所有库的本地副本。有些甚至没有提及他们假设您将使用本地 SQL 服务器进行测试/开发。
首先,您在本地安装的 python 模块不会神奇地上传到 GAE。您可以使用现有的 GAE 库,也可以将所有代码放入项目中以进行上传。
其次,GAE 在本地安装所有可用的库,因此您可以使用它们进行开发。所以你不应该自己去获取(潜在的版本/插件冲突问题)。
我建立了一个非常简单的项目。我还没有费心去安装本地 SQL 服务器。我在 Windows 上 (aaaargh) aargh。我正处于想要 python manage.py syncdb 的阶段。在 settings.py 中,DATABASE 必须包含连接信息/url 内容。据我了解,这可以用于带有 mysql 位的本地数据库(即您自己的开发或部署后的云)或设置为使用 rdbms 从您的本地副本连接到云(不管是什么)。所以我设置了 'ENGINE': 'google.appengine.ext.django.backends.rdbms' 现在出现了这个错误:
Error was: No module named google.appengine.ext.django.backends.rdbms.base
我已经卸载了我的本地 django 副本并设置了我的 PYTHONPATH=C:\Program Files (x86)\Google\google_appengine\lib\django-1.5。如果没有这个集合,我会得到一个错误,所以我必须假设它使用的是 GAE 的 django。我也找到了 C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\django\backends\rdbms 路径,这听起来很相关。所以我不确定下一步该怎么做。我假设这个 rdbms 东西是与 SQL 数据库远程通信所必需的。我希望能够在本地/不在生产环境中进行测试。
我的配置中有什么问题会导致这种情况?
附带说明一下,每当我尝试使用 GAE 启动器启动服务器时,我都会得到 ImportError: Could not import settings 'myblog.settings' (Is it on sys.path?): No module名为 appengine_toolkit。 python manage.py runserver 工作正常,直到请求触发连接到 SQL 服务器的尝试。
请您参考如下方法:
我在这里缺少的主要内容是确保 python 可以看到 GAE 库。我在 Linux 中解决了这个问题:
export PYTHONPATH=/usr/local/google_appengine/:/usr/local/google_appengine/lib/:/usr/local/google_appengine/lib/django-1.5/
那是
google_appengine/google_appengine/lib/google_appengine/lib/django-1.5/
PYTHONPATH 只是不能在 Windows 上运行。关于 Could not import settings 'myblog.settings',这只发生在 Windows 上,我不明白为什么,真的不想浪费我的时间。
真正帮助我使用 GAE 的两件事是:
- 对预期的(但隐含的)GAE 有一些了解 project structure .
- 掌握
virtualenv(我发现 this 是一个不错的介绍),并迅速意识到 google app engine 的启动器在沙盒和您要使用的外部库方面有多么困惑。
最终,我的设置如下。我使用 virtualenv 将所有包安装到本地 env 目录。为了在本地测试,这工作正常(使用上面的 PYTHONPATH)。为了仅部署正确的包(例如推送 django-wiki 而不是 MySQLdb),我创建了一个 libs 目录并将我想要的所有内容链接到 env/lib/python2.7/site-packages/.
作为 PYTHONPATH 的更好替代品,类似这样的东西(在 settings.py 中):
IS_PRODUCTION = os.getenv('SERVER_SOFTWARE', '').startswith('Google App Engine')
if IS_PRODUCTION:
sys.path.insert(0, 'libs')
else:
sys.path.insert(0, 'env/lib/python2.7/site-packages/')
我还在 app.yaml 中添加了一个 skip_files: 部分以排除 #- ^env/.* 并在部署时取消注释.如果我像其他人提到的那样将我的 env 放在项目目录之外,这可能就没有必要了。
