在Google App Engine上使用Django的困难

0 投票
3 回答
2636 浏览
提问于 2025-04-15 22:52

我有一个Django 1.1.1的项目,一切运行得很好。现在我想把它导入到Google App Engine上。

我正在尝试按照这些说明进行操作。

我在开发服务器上运行它,结果出现了一个导入错误:

ImportError at /
No module named mysite.urls

这是mysite/的文件夹结构:

app.yaml
<DIR>          myapp
index.yaml
main.py
manage.py
<DIR>          media
settings.py
urls.py
__init__.py

app.yaml:

application: mysite
version: 1
runtime: python
api_version: 1

handlers:
- url: .*
  script: main.py

来自settings.py

ROOT_URLCONF = 'mysite.urls'

我哪里做错了?

更新

现在我遇到了这个错误:

Request Method:     GET
Request URL:    http://localhost:8082/
Exception Type:     AttributeError
Exception Value:    'module' object has no attribute 'autodiscover'
Exception Location:     C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py in LoadModuleRestricted, line 1782

main.py

import logging, os

# Google App Engine imports.
from google.appengine.ext.webapp import util

# Force Django to reload its settings.
from django.conf import settings
settings._target = None

# Must set this env var before importing any part of Django
# 'project' is the name of the project created with django-admin.py
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'

import logging
import django.core.handlers.wsgi
import django.core.signals
import django.db
import django.dispatch.dispatcher

def log_exception(*args, **kwds):
    logging.exception('Exception in request:')

# Log errors.
django.dispatch.dispatcher.connect(
    log_exception, django.core.signals.got_request_exception)

# Unregister the rollback event handler.
django.dispatch.dispatcher.disconnect(
    django.db._rollback_on_exception,
    django.core.signals.got_request_exception)

def main():
    # Create a Django application for WSGI.
    application = django.core.handlers.wsgi.WSGIHandler()

    # Run the WSGI CGI handler with that application.
    util.run_wsgi_app(application)

if __name__ == '__main__':
    main()

engineapp/的目录结构:

<DIR> mysite
app.yaml
index.yaml
main.py

engineapp/mysite的目录结构:

<DIR> myapp
<DIR> media
__init__.py
initial_data.json
manage.py
settings.py
urls.py

我觉得我离成功越来越近了,但还是没有完全解决。

3 个回答

0

我没有在App Engine上使用过纯Django。不过根据我所了解,你需要用到djangoappengine-patch才能让它正常工作。你可以在http://www.allbuttonspressed.com/projects上查看相关信息并下载它。

1

这是我的 main.py 文件:

import os
import sys
import logging

# Google App Hosting imports.
from google.appengine.ext.webapp import util
from google.appengine.dist import use_library

os.environ["DJANGO_SETTINGS_MODULE"] = "mysite.settings"
sys.path.append("/home/brox/tmp/mysite")

use_library('django', '1.1')

# Enable info logging by the app (this is separate from appserver's
# logging).
logging.getLogger().setLevel(logging.DEBUG)

def log_exception(*args, **kwds):
  logging.exception('Exception in request:')

# Force sys.path to have our own directory first, so we can import from it.
sys.path.insert(0, os.path.abspath(os.path.dirname(__file__)))

# Force Django to reload its settings.
from django.conf import settings
settings._target = None

import django.core.handlers.wsgi
import django.core.signals
import django.db

# Log errors.
django.dispatch.Signal.connect(
   django.core.signals.got_request_exception, log_exception)

# Unregister the rollback event handler.
django.dispatch.Signal.disconnect(
django.core.signals.got_request_exception,
django.db._rollback_on_exception)

def main():    
    # Create a Django application for WSGI.
    application = django.core.handlers.wsgi.WSGIHandler()

    # Run the WSGI CGI handler with that application.
    util.run_wsgi_app(application)

if __name__ == "__main__":
    main()

你可以看到这里有一些额外的路径,而且 Django 的错误日志记录方式也稍微不同……

希望这对你有帮助。

2

试着把 ROOT_URLCONF 改成 'urls'。我觉得在 App Engine 上运行时,你的应用的父目录(这里指的是 App Engine 的意思,而不是 Django 的意思)可能不在 sys.path 里,这样的话它就看不到 mysite 作为一个 Python 包或模块。

编辑以跟上修改后的问题:

现在听起来你不小心在用 Django 0.96,但你其实想用 Django 1.1 以上的版本。当你在 App Engine 上 import django 时,除非你明确告诉 App Engine 你想用不同的版本,否则你会得到 0.96。

像这样

from google.appengine.dist import use_library
use_library('django', '1.1')

来自 jonmiddleton 的回答 应该能解决这个问题。请注意,为了在开发服务器上使用这个,你必须自己安装 Django 1.1,因为它没有和 SDK 一起打包。

另外,尽我所知,你在 App Engine 上使用 Django 管理网站可能不会有什么好运。

撰写回答