【问题标题】:Struggling with imports on Google App Engine在 Google App Engine 上苦苦挣扎
【发布时间】:2013-02-20 13:10:40
【问题描述】:

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

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

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

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

【问题讨论】:

标签: python django google-app-engine


【解决方案1】:

我以前遇到过同样的问题。 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

【讨论】:

  • 谢谢,但是当我移动 app.yaml 时,我从 appcfg.py 收到一个错误:错误:目录不包含 app.yaml 配置文件。根据谷歌文档,app.yaml 需要驻留在顶级目录中是有意义的。
  • @lucernia 感谢您的帮助。我经常问自己 Django 的分层项目结构有什么好处。除了组织方面,我看不到任何方面。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    相关资源
    最近更新 更多