Проблемы с Django в Google App Engine - PullRequest
0 голосов
/ 19 мая 2010

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

Я пытаюсь следовать этим инструкциям.

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

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 ]

2 голосов
/ 19 мая 2010

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

РЕДАКТИРОВАТЬ, чтобы идти в ногу с отредактированным вопросом:

Теперь звучит так, что вы случайно используете 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')

из ответ Джонмиддлтона должен помочь. Обратите внимание, что для использования этого на сервере разработки у вас должна быть установлена ​​собственная копия Django 1.1, поскольку она не входит в комплект SDK.

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

1 голос
/ 19 мая 2010

Вот мой 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 немного отличается ...

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

0 голосов
/ 19 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...