我正在努力使用Google App Engine上的导入功能。我有一个Django / Python项目,具有以下(标准)设置:
[myproject]
|
-[myproject]
|
--[app1]
|
--[app2]
第二个[myproject]
目录(我认为)被认为是项目根目录,其名称与项目的顶级目录相同。这个结构是由Django的startproject
命令创建的。
说,我在MyClass
中有一个app1.models
课,我想在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
不在尝试部署的结构的根目录中时,GAE将不会运行。
我尝试了Lipis提到的答案非常好。我不得不添加以下几行:
import sys
sys.path.insert(1, 'myproject')
同时发送到main.py
和settings.py
。仅将其添加到main.py
是不够的。 GAE仍然无法找到我的应用程序。
我以为我很好地阅读了关于GAE的谷歌文档,但我要么一定错过了它,要么它被埋在某个地方......如果想在GAE上运行Django,这非常重要......
答案 0 :(得分: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
将app.yaml移动到内部myproject文件夹时,内部项目目录将成为GAE的工作目录。因此,如果您将谷歌应用引擎luncher指向内部myproject文件夹,它应该没有问题。
或者为了方便起见,您可以删除外部myproject文件夹并直接使用内部myproject文件夹。
[myproject]
|
-[app1]
|
-[app2]
|
-app.yaml
-urls.py
-wsgi.py
-settings.py
-manager.py
答案 1 :(得分:1)
经过一番思考后,我决定采用Lipis在评论中提出的解决方案。这解决了Google App Engine中的导入问题,同时允许我保留Django startproject
设置的默认项目结构。