Google App Engine - Django 1.4 on GAE: sqlite "ImportError: cannot import name utils"



我想让sqlite3支持工作在Django 1.4在谷歌应用引擎1.7.4在Python 2.7。

我摆弄了一下"Google Cloud SQL"数据库后端,所有工作都很好(syncdb,插入/更新/删除,…)。

但是后来我启用了sqlite(因为Google Cloud SQL在本地主机上很慢):

import os
if (os.getenv('SERVER_SOFTWARE', '').startswith('Google App Engine') or
    os.getenv('SETTINGS_MODE') == 'pushtolive'):
    # Running on production App Engine, so use a Google Cloud SQL database.
    DATABASES = {
        'default': {
            'ENGINE': 'google.appengine.ext.django.backends.rdbms',
            'INSTANCE': 'xyz:xyz',
            'NAME': 'my_database',
        }
    }
else:
    # Running in development, so use a local SQLite database
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': '/tmp/mysite.db',
        }
    }

,当我打开任何url(例如127.0.0.1:8080)时,我就会遇到这个可怕的堆栈跟踪。我剥离了堆栈跟踪,使其更易于阅读:

ERROR    2012-12-29 09:07:06,223 base.py:215] Internal Server Error: /favicon.ico
Traceback (most recent call last):
  File "/Users/philipp/python/mysite/urls.py", line 4, in <module>
    from django.contrib import admin
  File ".../google_appengine/lib/django_1_4/django/contrib/admin/__init__.py", line 3, in <module>
    from django.contrib.admin.helpers import ACTION_CHECKBOX_NAME
  File ".../google_appengine/lib/django_1_4/django/contrib/admin/helpers.py", line 2, in <module>
    from django.contrib.admin.util import (flatten_fieldsets, lookup_field,
  File ".../google_appengine/lib/django_1_4/django/contrib/admin/util.py", line 1, in <module>
    from django.db import models
  File ".../google_appengine/lib/django_1_4/django/db/__init__.py", line 40, in <module>
    backend = load_backend(connection.settings_dict['ENGINE'])
  File ".../google_appengine/lib/django_1_4/django/db/__init__.py", line 34, in __getattr__
    return getattr(connections[DEFAULT_DB_ALIAS], item)
  File ".../google_appengine/lib/django_1_4/django/db/utils.py", line 92, in __getitem__
    backend = load_backend(db['ENGINE'])
  File ".../google_appengine/lib/django_1_4/django/db/utils.py", line 24, in load_backend
    return import_module('.base', backend_name)
  File ".../google_appengine/lib/django_1_4/django/utils/importlib.py", line 35, in import_module
    __import__(name)
  File ".../google_appengine/lib/django_1_4/django/db/backends/sqlite3/base.py", line 14, in <module>
    from django.db import utils
ImportError: cannot import name utils

从堆栈跟踪我读到执行运行到django.db.utils模块,然后进入django.db.backends.sqlite3.base,然后它试图再次跳入django.db.utils,但奇怪的是失败了。

问题似乎在GAE环境中,因为这可以工作:

python mysite/manage.py syncdb

还有这个

python mysite/manage.py shell
>>> from django.contrib.auth.models import User
>>> u = User(username="hans")
>>> u.save()
>>> User.objects.all()
[<User: hans>]

我试过了:

  • 从/切换到Django 1.3/1.4
  • 卸载GAE,重新安装
  • 我尝试了所有的解决方案,谷歌揭示了"import terror from django.db import utils"
  • 有一个类似的问题。我试着执行问题中的语句,但没有遇到问题。

我用的是OS X 10.8.2我的PYTHONPATH是:/usr/local/google_appengine:/usr/local/google_appengine/lib/django_1_4

由于在开发中使用sqlite而在生产中使用mysql(如Cloud SQL所使用的)不是很好的实践,因此我不建议任何人使用这种设置。

然后,有选项--use_sqlite:这是用来加速开发时使用谷歌数据存储。Cloud SQL没有类似的选项

这可以通过将_sqlite3附加到/usr/local/google_appengine/google/appengine/tools/dev_appserver_import_hook.py中的_WHITE_LIST_C_MODULES来将sqlite3模块列入白名单来解决。

注意,你需要在应用引擎启动器中选择"Make Symlinks…"来从/usr/local访问文件。

在最新版本的SDK中,您可以通过添加

来启用沙箱中的sqlite3模块。
'sqlite3' in name.lower()

在google-app-engine/google/appengine/tools/devappserver2/python/sandbox.py中的_should_keep_module函数

(大约第195行)

相关内容

  • 没有找到相关文章

最新更新