【问题标题】:Django 1.4 on GAE: sqlite "ImportError: cannot import name utils"GAE上的Django 1.4:sqlite“ImportError:无法导入名称工具”
【发布时间】:2012-12-14 08:43:21
【问题描述】:

我正在尝试在 Python 2.7 上的 Google App Engine 1.7.4 上的 Django 1.4 上获得 sqlite3 支持。

我摆弄了“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',
        }
    }

当我打开任何网址(例如 127.0.0.1:8080)时,我会遇到 this monstrous stack trace。我剥离了堆栈跟踪,使其更具可读性:

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 切换
  • uninstalled GAE,重新安装了
  • 我尝试了谷歌为“来自 django.db 导入实用程序的 ImportError”揭示的所有解决方案
  • this similar question。我尝试执行问题中的语句,但没有遇到问题。

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

【问题讨论】:

  • 我建议你把你的编辑变成一个答案(你解释这不是一个好主意),然后选择那个。
  • 在您添加评论后才看到这个 - 有同样的想法 :-)
  • 你为什么删除你的答案?
  • 因为它以数据存储为中心且具有误导性。我开始吸引反对者。

标签: django google-app-engine sqlite django-1.4


【解决方案1】:

因为它是not good practice to use sqlite in dev and mysql (as used by Cloud SQL) in production,所以我不向任何人推荐这种设置。

然后,有--use_sqlite 选项:这用于在使用 Google Datastore 时加快开发速度。 Cloud SQL 没有类似的选项。

【讨论】:

  • +1 表示感谢您回来并告知其他人此问题。
【解决方案2】:

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

注意,您需要在应用引擎启动器中选择“制作符号链接...”才能从/usr/local 访问文件。

【讨论】:

  • 干杯伙伴,我遇到了这个问题,实际上我想我应该问你如何解决它。波格丹 :)
【解决方案3】:

在最新版本的SDK中,可以在沙箱中添加sqlite3模块

'sqlite3' in name.lower()

在 google-app-engine/google/appengine/tools/devappserver2/python/sandbox.py 的 _should_keep_module 函数中(第 195 行左右)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    • 2015-04-30
    • 2019-08-27
    • 2016-09-07
    • 2018-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多