2010-05-18 4 views
0

У меня есть проект Django 1.1.1, который отлично работает. Я пытаюсь импортировать его в Google App Engine.Трудности с Django в Google App Engine

Я пытаюсь следовать этому instructions.

Я запустить его на сервере разработчика, и я получаю сообщение об ошибке импорта:

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' 

Что я делаю неправильно?

UPDATE:

теперь я получаю эту ошибку:

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 

Я чувствую, что я все ближе, но до сих пор не существует.

ответ

0

Я не использовал чистый django с appengine. Но из того, что я прочитал, вам нужен djangoappengine-patch, чтобы он работал. Вы можете прочитать об этом и загрузить его с http://www.allbuttonspressed.com/projects.

2

Попробуйте изменить ROOT_URLCONF на номер 'urls'. Я не думаю, что родительский каталог вашего приложения (в смысле App Engine, а не в Django sense) находится на sys.path при работе в App Engine, а это значит, что он не видит mysite в качестве пакета/модуля Python.

EDIT, чтобы идти в ногу с отредактированной вопрос:

Теперь это звучит, как вы неосторожно с помощью Django 0.96, но рассчитывая использовать Django 1.1+. Когда вы добавите import django в App Engine, вы получите 0.96, если вы явно не укажете App Engine, что хотите использовать другую версию.

Что-то вроде

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

из jonmiddleton's answer должны сделать трюк. Обратите внимание, что для использования этого на сервере разработки у вас должна быть установлена ​​ваша собственная версия Django 1.1, поскольку она не поставляется вместе с SDK.

Обратите внимание, что, насколько я знаю, вам не удастся использовать сайт администратора Django в App Engine.

+0

, что sorta работал, но у меня все еще больше проблем. (Обновлен OP.) –

+0

См. Мой отредактированный ответ. Хотя вы, возможно, должны были закрыть этот вопрос и открыть новый, так как теперь у вас другая проблема. –

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() 

Как вы можете видеть, что есть дополнительные пути и протоколирование ошибок Джанго немного отличается ...

Надеются, что это поможет вам.

Смежные вопросы