0

我正在为 Google App Engine 上的导入而苦苦挣扎。我有一个具有以下(标准)设置的 Django/Python 项目:

[myproject]
|
-[myproject]
|
--[app1]
|
--[app2]

第二个[myproject]目录(我认为)被认为是项目根目录,并且与项目的顶级目录命名相同。这个结构是由 Django 的startproject命令创建的。

说,我有一个我想MyClass在其中使用的类。当我使用 GAE SDK 进行本地开发时,我可以:app1.modelsapp2.models

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 提到的答案,效果很好。我必须添加以下几行:

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

main.pysettings.py. 仅仅添加它main.py是不够的。GAE 仍然无法找到我的应用程序。

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

4

2 回答 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 的工作目录。因此,如果您将 google app engine luncher 指向内部 myproject 文件夹,它应该可以正常工作。

或者为了更简单,您可以删除外部 myproject 文件夹并直接使用内部 myproject 文件夹。

[myproject]
|
-[app1]
|
-[app2]
|
-app.yaml
-urls.py
-wsgi.py
-settings.py
-manager.py
于 2013-03-06T00:56:40.923 回答
1

经过一番思考,我决定采用 Lipis 在评论中建议的解决方案。这解决了 Google App Engine 中的导入问题,同时允许我保留 Django 设置的默认项目结构startproject

于 2013-03-14T09:43:54.307 回答