在谷歌应用引擎上挣扎着进口

时间:2013-03-05 22:42:22

标签: python django google-app-engine

我正在努力使用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.pysettings.py。仅将其添加到main.py是不够的。 GAE仍然无法找到我的应用程序。

我以为我很好地阅读了关于GAE的谷歌文档,但我要么一定错过了它,要么它被埋在某个地方......如果想在GAE上运行Django,这非常重要......

2 个答案:

答案 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

EDIT1

将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设置的默认项目结构。