在Google App Engine上导入问题困扰
我在使用Google App Engine时遇到了导入的问题。我有一个Django/Python项目,结构如下:
[myproject]
|
-[myproject]
|
--[app1]
|
--[app2]
第二个 [myproject]
目录(我认为)被认为是项目的根目录,并且它的名字和项目的顶层目录是一样的。这种结构是通过Django的 startproject
命令创建的。
假设我在 app1.models
中有一个类 MyClass
,我想在 app2.models
中使用它。当我在本地使用GAE SDK开发时,我可以这样做:
from app1.models import MyClass
但是,当我部署到Google App Engine时,我需要把这个导入改成:
from myproject.app.models import MyClass
否则GAE找不到这个类,会报错。另外,在我的 settings.py
文件中,我可以在本地这样引用 INSTALLED_APPS
:
'app1',
'app2',
...
但在GAE上我需要这样做:
'myproject.app1',
'myproject.app2',
...
在本地开发时,这两种方法都可以用。但在部署到GAE时,只有使用完整路径的方法有效。为什么会这样呢?
--
编辑:
我尝试了lucernia提供的答案,但遇到了各种问题。最大的障碍是部署到GAE时,如果 app.yaml
不在结构的根目录下,部署就无法进行。
我还尝试了Lipis提到的答案,这个方法效果不错。我需要在我的 main.py
和 settings.py
中添加以下几行:
import sys
sys.path.insert(1, 'myproject')
仅仅在 main.py
中添加是不够的。GAE仍然无法找到我的应用。
我以为我对Google的GAE文档读得很仔细,但我可能错过了这一点,或者它被埋在某个地方……如果想在GAE上运行Django,这一点非常重要……
2 个回答
我之前也遇到过同样的问题。
在谷歌应用引擎(GAE)中,根目录就是你放置app.yaml
文件的文件夹。
所以你可能把app.yaml
放在了上层的myproject
文件夹里,而把django项目放在了下层的myproject
文件夹里。
在这种情况下,当你用django.py runserver启动开发服务器时,它的行为和用dev_appserver.py以及GAE运行环境启动时会有所不同。
在我的例子中,我把app.yaml
放在和settings.py、wsgi.py、urls.py同一个文件夹里。这样我就可以顺利导入我的模块了。
myproject
- admin_system/
- __init__.py
- models.py
- app.yaml
- wsgi.py
- urls.py
- settings.py
- manager.py
在settings.py中
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
# Uncomment the next line to enable the admin:
'django.contrib.admin',
# Uncomment the next line to enable admin documentation:
'django.contrib.admindocs',
'admin_system',
)
在wsgi.py中
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
这样在开发环境和GAE运行环境中的导入路径就会是一样的。
import admin_system.models
编辑1
如果你把app.yaml
移动到内层的myproject文件夹,那么内层的项目目录就会成为你在GAE中的工作目录。所以如果你把谷歌应用引擎启动器指向内层的myproject文件夹,它应该就能正常工作。
或者为了简化操作,你也可以直接删除外层的myproject文件夹,直接使用内层的myproject文件夹。
[myproject]
|
-[app1]
|
-[app2]
|
-app.yaml
-urls.py
-wsgi.py
-settings.py
-manager.py
经过一番思考,我决定采用Lipis在评论中提到的解决方案。这个方法解决了在Google App Engine中遇到的导入问题,同时也让我可以保留Django的startproject
命令设置的默认项目结构。