在Google App Engine上导入问题困扰

0 投票
2 回答
771 浏览
提问于 2025-04-17 18:03

我在使用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.pysettings.py 中添加以下几行:

import sys
sys.path.insert(1, 'myproject')

仅仅在 main.py 中添加是不够的。GAE仍然无法找到我的应用。

我以为我对Google的GAE文档读得很仔细,但我可能错过了这一点,或者它被埋在某个地方……如果想在GAE上运行Django,这一点非常重要……

2 个回答

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
1

经过一番思考,我决定采用Lipis在评论中提到的解决方案。这个方法解决了在Google App Engine中遇到的导入问题,同时也让我可以保留Django的startproject命令设置的默认项目结构。

撰写回答