2013-03-05 56 views
0

我在Google App Engine上导入时遇到困难。我有以下的(标准)建立一个Django/Python项目:在Google App Engine上苦于进口

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

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

说,我有一个类MyClassapp1.models,我想用在app2.models。当我开发本地使用GAE SDK,我可以这样做:

from app1.models import MyClass 

然而,当我部署到谷歌应用程序引擎,我需要换一种说法进口:

from myproject.app.models import MyClass 

否则GAE不会找到该类并中止一个错误。此外,在我的settings.py我可以在本地参考INSTALLED_APPS为:

'app1', 
'app2', 
... 

对于GAE我需要做的:

'myproject.app1', 
'myproject.app2', 
... 

地方发展,这两种方法的工作。部署到GAE时,只有使用完整路径名的方法才有效。为什么是这样??

-

编辑:

我试图通过lucernia提供的答案,但碰到了各种各样的问题。主要的绊脚石是部署到GAE,当app.yaml不在要尝试部署的结构的根目录中时,它将不会运行。

我试过里皮斯提到的答案,工作得很好。我不得不添加下面几行:

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

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

我想我读谷歌的GAE文档得很好,但我必须要么错过了这个,否则在某处埋藏......如果一个人想在GAE上运行Django的非常重要的......

+1

请参阅此答案,并且很可能您会找出要执行的操作:http://stackoverflow.com/a/14851686/8418 – Lipis 2013-03-05 23:29:53

回答

1

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

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你的工作目录。因此,如果您将Google应用程序引擎启动器指向内部myproject文件夹,它应该没有问题。

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

[myproject] 
| 
-[app1] 
| 
-[app2] 
| 
-app.yaml 
-urls.py 
-wsgi.py 
-settings.py 
-manager.py 
+0

谢谢,但是当我移动app.yaml时,从appcfg.py :错误:目录不包含app.yaml配置文件。根据Google文档app.yaml需要驻留在顶层目录中,这是有道理的。 – Roger 2013-03-06 01:25:01

+0

嗨罗杰,请参阅我的编辑1 – lucemia 2013-03-06 08:30:19

+1

@lucernia感谢您的帮助。我经常问自己,Django的分层项目结构有什么好处。除了组织方面,我没有看到任何。 – Roger 2013-03-06 08:57:39