[英]How to configure Django session with google app engine datastore (NDB)
这是我尝试使用会话request.session['user'] = user
时遇到的错误
ImproperlyConfigured at /registration/
settings.DATABASES is improperly configured. Please supply the ENGINE value. Check settings documentation for more details.
这是我得到错误的view.py函数
@csrf_exempt
@require_POST
def registration(request):
form = regi_form(request.POST)
if form.is_valid():
email_key = generate_email_key()
try:
send_activ_mail( to = form.cleaned_data['email'],key = email_key )
except Exception,e:
print '@registration %s'%e
user = User(
name= form.cleaned_data['name'],
email= form.cleaned_data['email'],
password= make_password(password=form.cleaned_data['password'], salt=None, hasher='default'),
last_login= datetime.now(),
email_activation_key= email_key,
email_active= False,
)
user.put()
request.session['user'] = user
response = {
'meta' : { 'message' : 'Registered' , 'enum' : 'Ok' },
'payload' : { 'user' : {'name' : user.name } }
}
return HttpResponse(json.dumps(response),content_type="application/json")
else:
errors_dict = {}
if form.errors:
for error in form.errors:
e = form.errors[error]
str_remove = str(e)
str_need = re.search('<li>(.+?)</li>', str_remove).group(1)
errors_dict[error] = unicode(str_need)
return HttpResponseBadRequest(json.dumps(errors_dict), content_type="application/json")
我遵循了将NDB与Django Web框架一起使用的方法,并添加了中间件
'google.appengine.ext.ndb.django_middleware.NdbDjangoMiddleware',
但是没有关于会话的任何解释,因此我在setting.py中将其留为空白DATABASE = {}
Setting.py
# Django settings for tradex_plus project.
DEBUG = True
TEMPLATE_DEBUG = DEBUG
import os
PROJECT_DIR = os.path.dirname(__file__)
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
# gives the root of the project: root/. This is THE ROOT OF THE PROJECT
PROJECT_PATH = os.path.abspath(os.path.dirname(__name__))
# import sys
# sys.path.insert(0, os.path.join(BASE_DIR, "lib/python2.7/site-packages/") )
ADMINS = (
# ('Your Name', 'your_email@example.com'),
)
MANAGERS = ADMINS
# Hosts/domain names that are valid for this site; required if DEBUG is False
# See https://docs.djangoproject.com/en/1.5/ref/settings/#allowed-hosts
ALLOWED_HOSTS = []
# Local time zone for this installation. Choices can be found here:
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
# although not all choices may be available on all operating systems.
# In a Windows environment this must be set to your system time zone.
TIME_ZONE = 'America/Chicago'
# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = 'en-us'
SITE_ID = 1
# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N = True
# If you set this to False, Django will not format dates, numbers and
# calendars according to the current locale.
USE_L10N = True
# If you set this to False, Django will not use timezone-aware datetimes.
USE_TZ = True
# Absolute filesystem path to the directory that will hold user-uploaded files.
# Example: "/var/www/example.com/media/"
MEDIA_ROOT = ''
# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash.
# Examples: "http://example.com/media/", "http://media.example.com/"
MEDIA_URL = ''
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.7/howto/static-files/
STATIC_URL = '/frontend/'
# STATIC_ROOT = os.path.join(BASE_DIR, "fronten")
FRONTEND = os.path.join(BASE_DIR, "frontend")
STATICFILES_DIRS = (
FRONTEND,
)
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
# 'django.contrib.staticfiles.finders.AppDirectoriesFinder',
# 'django.contrib.staticfiles.finders.DefaultStorageFinder',
)
# Make this unique, and don't share it with anybody.
SECRET_KEY = 'c94coq2ly9*y*j@-l!a)eeubf)17i0yy)=lrkm-h#da@!v96ot'
# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
# 'django.template.loaders.eggs.Loader',
)
TEMPLATE_DIRS = (
# Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
os.path.join(BASE_DIR, "frontend"),
)
MIDDLEWARE_CLASSES = (
'google.appengine.ext.ndb.django_middleware.NdbDjangoMiddleware',
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
# Uncomment the next line for simple clickjacking protection:
# 'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
ROOT_URLCONF = 'tradex_plus.urls'
# Python dotted path to the WSGI application used by Django's runserver.
WSGI_APPLICATION = 'tradex_plus.wsgi.application'
INSTALLED_APPS = (
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.staticfiles',
'user_module',
)
# A sample logging configuration. The only tangible logging
# performed by this configuration is to send an email to
# the site admins on every HTTP 500 error when DEBUG=False.
# See http://docs.djangoproject.com/en/dev/topics/logging for
# more details on how to customize your logging configuration.
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
'handlers': {
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler'
}
},
'loggers': {
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
},
}
}
DATABASES = {}
调试器返回此
mproperlyConfigured at /registration/
settings.DATABASES is improperly configured. Please supply the ENGINE value. Check settings documentation for more details.
Request Method: POST
Request URL: http://localhost:8080/registration/
Django Version: 1.5.8
Python Executable: /usr/bin/python
Python Version: 2.7.6
Python Path: ['/Users/foodprinting/proj/tradex-plus', '/Users/foodprinting/google-cloud-sdk/platform/google_appengine', '/Users/foodprinting/google-cloud-sdk/platform/google_appengine', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload', '/Users/foodprinting/google-cloud-sdk/platform/google_appengine/lib/django-1.5', '/Users/foodprinting/google-cloud-sdk/platform/google_appengine/lib/protorpc-1.0', '/Users/foodprinting/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.3', '/Users/foodprinting/google-cloud-sdk/platform/google_appengine/lib/webob-1.1.1', '/Users/foodprinting/google-cloud-sdk/platform/google_appengine/lib/yaml-3.10']
Server time: Fri, 27 Feb 2015 10:46:26 +0000
Installed Applications:
('django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.staticfiles',
'user_module')
Installed Middleware:
('google.appengine.ext.ndb.django_middleware.NdbDjangoMiddleware',
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware')
Traceback:
File "/Users/foodprinting/google-cloud-sdk/platform/google_appengine/lib/django-1.5/django/core/handlers/base.py" in get_response
185. response = middleware_method(request, response)
File "/Users/foodprinting/google-cloud-sdk/platform/google_appengine/lib/django-1.5/django/contrib/sessions/middleware.py" in process_response
38. request.session.save()
File "/Users/foodprinting/google-cloud-sdk/platform/google_appengine/lib/django-1.5/django/contrib/sessions/backends/db.py" in save
50. session_key=self._get_or_create_session_key(),
File "/Users/foodprinting/google-cloud-sdk/platform/google_appengine/lib/django-1.5/django/contrib/sessions/backends/base.py" in _get_or_create_session_key
147. self._session_key = self._get_new_session_key()
File "/Users/foodprinting/google-cloud-sdk/platform/google_appengine/lib/django-1.5/django/contrib/sessions/backends/base.py" in _get_new_session_key
141. if not self.exists(session_key):
File "/Users/foodprinting/google-cloud-sdk/platform/google_appengine/lib/django-1.5/django/contrib/sessions/backends/db.py" in exists
26. return Session.objects.filter(session_key=session_key).exists()
File "/Users/foodprinting/google-cloud-sdk/platform/google_appengine/lib/django-1.5/django/db/models/query.py" in exists
610. return self.query.has_results(using=self.db)
File "/Users/foodprinting/google-cloud-sdk/platform/google_appengine/lib/django-1.5/django/db/models/sql/query.py" in has_results
447. return bool(compiler.execute_sql(SINGLE))
File "/Users/foodprinting/google-cloud-sdk/platform/google_appengine/lib/django-1.5/django/db/models/sql/compiler.py" in execute_sql
836. sql, params = self.as_sql()
File "/Users/foodprinting/google-cloud-sdk/platform/google_appengine/lib/django-1.5/django/db/models/sql/compiler.py" in as_sql
74. out_cols = self.get_columns(with_col_aliases)
File "/Users/foodprinting/google-cloud-sdk/platform/google_appengine/lib/django-1.5/django/db/models/sql/compiler.py" in get_columns
174. result = ['(%s) AS %s' % (col[0], qn2(alias)) for alias, col in six.iteritems(self.query.extra_select)]
File "/Users/foodprinting/google-cloud-sdk/platform/google_appengine/lib/django-1.5/django/db/backends/dummy/base.py" in complain
15. raise ImproperlyConfigured("settings.DATABASES is improperly configured. "
Exception Type: ImproperlyConfigured at /registration/
Exception Value: settings.DATABASES is improperly configured. Please supply the ENGINE value. Check settings documentation for more details.
Request information:
GET: No GET data
POST:
re_password = u'hungrymind'
name = u'praveen'
password = u'hungrymind'
email = u'prrraveen@gmail.com'
FILES: No FILES data
COOKIES:
_tinyowl_session = 'BAh7CEkiD3Nlc3Npb25faWQGOgZFVEkiJWYyYTY0ZmVjYjQxMmNlOWE0M2I2ZTMyYWE5OTgzZjI0BjsAVEkiEnNlc3Npb25fdG9rZW4GOwBGSSJgNzE5ckJnZ3hDaEZLTlRIdnViM0NXSmJFTFhvQUc4OTJNaWVTcTNGSmZGUlVWdG9DeDBSN1JTU2tXc0hUWTlxbUNXQ05DekNqSXZNdUw1MXBVV2xsZ3BkS1FDQwY7AFRJIhBfY3NyZl90b2tlbgY7AEZJIjFQMmw0S2phSjl0M3NqTzI1dTdtKzQzbFFzdjVmMktjZUc1ZVNFMk9XU1BrPQY7AEY%3D--218a0a0cebae06e6b014d18d21e247a891ca28a4'
META:
REMOTE_ADDR = '::1'
SERVER_PORT = '8080'
QUERY_STRING = ''
USER_IS_ADMIN = '0'
APPENGINE_RUNTIME = 'python27'
wsgi.errors = <google.appengine.api.logservice.logservice._LogsStreamBuffer object at 0x105b5c790>
HTTP_CONTENT_LENGTH = '83'
PATH_INFO = u'/registration/'
HTTP_REFERER = 'http://localhost:8080/'
AUTH_DOMAIN = 'gmail.com'
TZ = 'UTC'
CURRENT_VERSION_ID = '1.801706933843596328'
INSTANCE_ID = 'd9ac8faff8dfc88cbfd6afedd0c9b97dbcbe'
CONTENT_LENGTH = '83'
REQUEST_ID_HASH = '4F1521C4'
HTTP_ACCEPT_LANGUAGE = 'en-US,en;q=0.8'
SERVER_PROTOCOL = 'HTTP/1.1'
HTTP_HOST = 'localhost:8080'
wsgi.multithread = True
USER_ORGANIZATION = ''
SCRIPT_NAME = u''
USER_NICKNAME = ''
SERVER_SOFTWARE = 'Development/2.0'
DJANGO_SETTINGS_MODULE = 'tradex_plus.settings'
HTTP_CONTENT_TYPE = 'application/x-www-form-urlencoded'
DATACENTER = 'us1'
HTTP_ORIGIN = 'http://localhost:8080'
wsgi.run_once = False
CURRENT_MODULE_ID = 'default'
DEFAULT_VERSION_HOSTNAME = 'localhost:8080'
wsgi.url_scheme = 'http'
APPLICATION_ID = 'dev~tradex-plus'
wsgi.version =
wsgi.input = <cStringIO.StringI object at 0x105b3d2d8>
USER_EMAIL = ''
HTTP_X_REQUESTED_WITH = 'XMLHttpRequest'
HTTPS = 'off'
HTTP_X_APPENGINE_COUNTRY = 'ZZ'
CSRF_COOKIE = u'ZlrIA6elo93vmMXpxwpPG9HpJNrdBjM7'
PATH_TRANSLATED = '/Users/foodprinting/proj/tradex-plus/tradex_plus/wsgi.pyc'
HTTP_ACCEPT = 'application/json, text/javascript, */*; q=0.01'
wsgi.multiprocess = True
CONTENT_TYPE = 'application/x-www-form-urlencoded'
HTTP_COOKIE = '_tinyowl_session=BAh7CEkiD3Nlc3Npb25faWQGOgZFVEkiJWYyYTY0ZmVjYjQxMmNlOWE0M2I2ZTMyYWE5OTgzZjI0BjsAVEkiEnNlc3Npb25fdG9rZW4GOwBGSSJgNzE5ckJnZ3hDaEZLTlRIdnViM0NXSmJFTFhvQUc4OTJNaWVTcTNGSmZGUlVWdG9DeDBSN1JTU2tXc0hUWTlxbUNXQ05DekNqSXZNdUw1MXBVV2xsZ3BkS1FDQwY7AFRJIhBfY3NyZl90b2tlbgY7AEZJIjFQMmw0S2phSjl0M3NqTzI1dTdtKzQzbFFzdjVmMktjZUc1ZVNFMk9XU1BrPQY7AEY%3D--218a0a0cebae06e6b014d18d21e247a891ca28a4'
REQUEST_LOG_ID = '8dfb77a9143ccd7c96b0ff19b9c94fe'
SERVER_NAME = 'localhost'
REQUEST_METHOD = 'POST'
HTTP_USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36'
USER_ID = ''
Settings:
Using settings module tradex_plus.settings
FORMAT_MODULE_PATH = None
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage'
DECIMAL_SEPARATOR = '.'
FIRST_DAY_OF_WEEK = 0
CSRF_FAILURE_VIEW = 'django.views.csrf.csrf_failure'
SESSION_COOKIE_HTTPONLY = True
INSTALLED_APPS =
PASSWORD_RESET_TIMEOUT_DAYS = u'********************'
DEFAULT_EXCEPTION_REPORTER_FILTER = 'django.views.debug.SafeExceptionReporterFilter'
LOGGING_CONFIG = 'django.utils.log.dictConfig'
LANGUAGE_CODE = 'en-us'
STATIC_URL = '/frontend/'
ROOT_URLCONF = 'tradex_plus.urls'
SESSION_COOKIE_DOMAIN = None
EMAIL_HOST_PASSWORD = u'********************'
INTERNAL_IPS =
LOGGING = {'version': 1, 'filters': {'require_debug_false': {'()': 'django.utils.log.RequireDebugFalse'}}, 'disable_existing_loggers': False, 'handlers': {'mail_admins': {'filters': ['require_debug_false'], 'class': 'django.utils.log.AdminEmailHandler', 'level': 'ERROR'}}, 'loggers': {'django.request': {'level': 'ERROR', 'handlers': ['mail_admins'], 'propagate': True}}}
DATABASE_ROUTERS = []
SHORT_DATE_FORMAT = 'm/d/Y'
DEFAULT_FROM_EMAIL = 'webmaster@localhost'
SESSION_COOKIE_AGE = 1209600
AUTHENTICATION_BACKENDS = 'django.contrib.auth.backends.ModelBackend'
AUTH_USER_MODEL = 'auth.User'
ABSOLUTE_URL_OVERRIDES = {}
DATETIME_FORMAT = 'N j, Y, P'
DATABASES = {}
SHORT_DATETIME_FORMAT = 'm/d/Y P'
FORCE_SCRIPT_NAME = None
FILE_CHARSET = 'utf-8'
STATICFILES_DIRS = '/Users/foodprinting/proj/tradex-plus/frontend'
TIME_INPUT_FORMATS =
PROJECT_PATH = '/Users/foodprinting/proj/tradex-plus'
TRANSACTIONS_MANAGED = False
MANAGERS =
DATE_FORMAT = 'N j, Y'
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'
PROFANITIES_LIST = u'********************'
SESSION_FILE_PATH = None
STATIC_ROOT = ''
SESSION_EXPIRE_AT_BROWSER_CLOSE = False
FILE_UPLOAD_MAX_MEMORY_SIZE = 2621440
LOGIN_REDIRECT_URL = '/accounts/profile/'
TEST_RUNNER = 'django.test.simple.DjangoTestSuiteRunner'
LANGUAGES_BIDI =
MIDDLEWARE_CLASSES =
SESSION_COOKIE_NAME = 'sessionid'
PASSWORD_HASHERS = u'********************'
EMAIL_HOST_USER = ''
ALLOWED_INCLUDE_ROOTS =
CSRF_COOKIE_NAME = 'csrftoken'
FIXTURE_DIRS =
X_FRAME_OPTIONS = 'SAMEORIGIN'
USE_ETAGS = False
DATE_INPUT_FORMATS =
DEFAULT_CHARSET = 'utf-8'
EMAIL_PORT = 25
TIME_FORMAT = 'P'
USE_THOUSAND_SEPARATOR = False
FILE_UPLOAD_TEMP_DIR = None
LOGOUT_URL = '/accounts/logout/'
LOCALE_PATHS =
PREPEND_WWW = False
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
DEBUG = True
MEDIA_URL = ''
BASE_DIR = '/Users/foodprinting/proj/tradex-plus'
STATICFILES_FINDERS = 'django.contrib.staticfiles.finders.FileSystemFinder'
THOUSAND_SEPARATOR = ','
FILE_UPLOAD_PERMISSIONS = None
SERVER_EMAIL = 'root@localhost'
SESSION_COOKIE_PATH = '/'
EMAIL_HOST = 'localhost'
DEFAULT_TABLESPACE = ''
TEMPLATE_DEBUG = True
LANGUAGE_COOKIE_NAME = 'django_language'
CACHE_MIDDLEWARE_KEY_PREFIX = u'********************'
COMMENTS_ALLOW_PROFANITIES = False
DATETIME_INPUT_FORMATS =
SESSION_SAVE_EVERY_REQUEST = False
DEBUG_PROPAGATE_EXCEPTIONS = False
LOGIN_URL = '/accounts/login/'
FRONTEND = '/Users/foodprinting/proj/tradex-plus/frontend'
USE_TZ = True
EMAIL_USE_TLS = False
ADMIN_FOR =
SITE_ID = 1
MEDIA_ROOT = ''
USE_I18N = True
USE_L10N = True
CACHES = {'default': {'BACKEND': 'django.core.cache.backends.locmem.LocMemCache'}}
PROJECT_DIR = '/Users/foodprinting/proj/tradex-plus/tradex_plus'
CACHE_MIDDLEWARE_SECONDS = 600
DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage'
APPEND_SLASH = True
TEMPLATE_LOADERS =
NUMBER_GROUPING = 0
IGNORABLE_404_URLS =
ADMINS =
YEAR_MONTH_FORMAT = 'F Y'
TEMPLATE_CONTEXT_PROCESSORS =
CSRF_COOKIE_DOMAIN = None
ALLOWED_HOSTS = []
CACHE_MIDDLEWARE_ALIAS = 'default'
WSGI_APPLICATION = 'tradex_plus.wsgi.application'
DEFAULT_INDEX_TABLESPACE = ''
TIME_ZONE = 'America/Chicago'
SESSION_CACHE_ALIAS = 'default'
CSRF_COOKIE_SECURE = False
FILE_UPLOAD_HANDLERS =
EMAIL_SUBJECT_PREFIX = '[Django] '
DISALLOWED_USER_AGENTS =
DEFAULT_CONTENT_TYPE = 'text/html'
TEMPLATE_STRING_IF_INVALID = ''
SESSION_COOKIE_SECURE = False
MESSAGE_STORAGE = 'django.contrib.messages.storage.fallback.FallbackStorage'
CSRF_COOKIE_PATH = '/'
SEND_BROKEN_LINK_EMAILS = False
TEMPLATE_DIRS = '/Users/foodprinting/proj/tradex-plus/frontend'
USE_X_FORWARDED_HOST = False
SIGNING_BACKEND = 'django.core.signing.TimestampSigner'
SETTINGS_MODULE = 'tradex_plus.settings'
LANGUAGES =
SECRET_KEY = u'********************'
MONTH_DAY_FORMAT = 'F j'
SECURE_PROXY_SSL_HEADER = None
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
You're seeing this error because you have DEBUG = True in your
Django settings file. Change that to False, and Django will
display a standard 500 page.
默认情况下,Django将会话存储在数据库中(使用模型django.contrib.sessions.models.Session)。 尽管这很方便,但是在某些设置中,将会话数据存储在其他位置更快,因此可以将Django配置为在文件系统或缓存中存储会话数据。
似乎Django将会话存储在您的数据库中,并使用其ORM框架。 由于您使用NDB,因此您不能依赖其ORM框架。 基本上,您有两个选择。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.