2010-05-18 9 views
0

J'ai un projet Django 1.1.1 qui fonctionne bien. J'essaie de l'importer dans Google App Engine.Difficultés avec Django sur Google App Engine

Je suis en train de suivre ces instructions.

je l'exécute sur le serveur dev, et je reçois une erreur d'importation:

ImportError at/
No module named mysite.urls 

C'est la structure du dossier de monsite/:

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 

de settings.py:

ROOT_URLCONF = 'mysite.urls' 

Qu'est-ce que je fais mal?

MISE À JOUR:

maintenant je reçois cette erreur:

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

structure Répertoire des engineapp/:

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

structure Répertoire des engineapp/monsite:

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

Je sens que je me rapproche, mais toujours pas là.

Répondre

0

Je n'ai pas utilisé pur django avec appengine. Mais d'après ce que j'ai lu, vous avez besoin du patch djangoappengine pour le faire fonctionner. Vous pouvez lire à ce sujet et le télécharger à partir de http://www.allbuttonspressed.com/projects.

2

Essayez de remplacer ROOT_URLCONF par 'urls'. Je ne pense pas que le répertoire parent de votre application (dans le sens App Engine, pas le sens de Django) soit sur sys.path lors de l'exécution sur App Engine, ce qui signifie qu'il ne voit pas mysite comme un paquet/module Python.

EDIT pour suivre à la question éditée:

Maintenant, il semble que vous utilisez, par inadvertance, Django 0.96, mais attendant d'utiliser Django 1.1+. Lorsque vous import django sur App Engine, vous finirez avec 0,96 à moins que vous ne disiez explicitement à App Engine que vous souhaitez utiliser une version différente.

Quelque chose comme

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

de jonmiddleton's answer devrait faire l'affaire. Veuillez noter que pour l'utiliser sur le serveur de développement, vous devez avoir installé votre propre copie de Django 1.1, car elle n'est pas fournie avec le SDK.

Veuillez noter que, pour autant que je sache, vous n'aurez aucune chance d'utiliser le site d'administration de Django sur App Engine.

+0

ça a marché, mais j'ai encore plus de problèmes. (OP mis à jour.) –

+0

Voir ma version modifiée maintenant. Bien que vous auriez peut-être dû fermer cette question et en ouvrir une nouvelle, puisque vous avez un problème différent maintenant. –

1

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

Comme vous pouvez le voir, il y a des chemins supplémentaires et l'enregistrement d'erreur de django est un peu différent ...

Espérons que cela vous aide.

Questions connexes