WSGIRequest'对象在Google App Engine中没有'user'属性

2 投票
1 回答
4172 浏览
提问于 2025-04-16 04:01

我刚开始学习django和Google App Engine,遇到了使用数据存储时的问题。每次我进行查询,比如说

db.GqlQuery("SELECT * FROM Listing ORDER BY date DESC LIMIT 10")

我都会收到一个错误:

'WSGIRequest' object has no attribute 'user'

这个错误似乎是在django核心的context_processors.py文件中产生的。网上找到的建议是把和用户相关的INSTALLED_APPS和MIDDLEWARE_CLASSES注释掉,但这似乎没有什么帮助。我的代码看起来是这样的:

MIDDLEWARE_CLASSES = (
#    'django.middleware.common.CommonMiddleware',
#    'django.contrib.sessions.middleware.SessionMiddleware',
#    'django.contrib.auth.middleware.AuthenticationMiddleware',
#    'django.middleware.doc.XViewMiddleware',
)

INSTALLED_APPS = (
#    'django.contrib.auth',
    'django.contrib.contenttypes',
#    'django.contrib.sessions',
    'django.contrib.sites',
)

我的Listing对象定义如下(之前有一个author属性,但现在已经注释掉了,并且对象用新名字重新定义):

class Listing(db.Model):
    #author = db.UserProperty()
    address = db.StringProperty()
    date = db.DateTimeProperty(auto_now_add=True)
    coords = db.GeoPtProperty()

有没有人知道这个错误是什么原因造成的,怎么解决呢?是不是需要以某种方式重置设置?

1 个回答

1

更新

sdolan 提出的解决方案是,在应用的 settings.py 文件中添加以下内容:

TEMPLATE_CONTEXT_PROCESSORS = (

"django.core.context_processors.debug",

"django.core.context_processors.i18n")

这样做实际上是去掉了第三个默认处理器 django.core.context_processors.auth(因为在 AppEngine 上我们不需要 Django 的认证组件,所以这个处理器是不必要的)。

谢谢你,sdolan,提供了这个解决方案!希望其他人也能用得上。:)

@Nick,我觉得把关于 CONTEXT_PROCESSORS 的这个重要信息放到教程里是很有必要的(http://code.google.com/appengine/articles/django.html

(对问题的原始跟进)

我也遇到了同样的问题,正在寻找解决办法……当 settings.py 里包含

DEBUG = True

时,一切都正常,但当我切换到

DEBUG = False

时,就出现了这个错误(这让我学习的动力都没了)。

@Nick Johnson,这是错误的堆栈信息:

Traceback (most recent call last):
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 3211, in _HandleRequest
    self._Dispatch(dispatcher, self.rfile, outfile, env_dict)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 3154, in _Dispatch
    base_env_dict=env_dict)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 527, in Dispatch
    base_env_dict=base_env_dict)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 2404, in Dispatch
    self._module_dict)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 2314, in ExecuteCGI
    reset_modules = exec_script(handler_path, cgi_path, hook)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 2212, in ExecuteOrImportScript
    script_module.main()
  File "C:\Dev\appengine\djangotest\main.py", line 37, in main
    util.run_wsgi_app(application)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\webapp\util.py", line 97, in run_wsgi_app
    run_bare_wsgi_app(add_wsgi_middleware(application))
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\webapp\util.py", line 115, in run_bare_wsgi_app
    result = application(env, _start_response)
  File "C:\Program Files (x86)\Google\google_appengine\lib\django\django\core\handlers\wsgi.py", line 189, in __call__
    response = self.get_response(request)
  File "C:\Program Files (x86)\Google\google_appengine\lib\django\django\core\handlers\base.py", line 103, in get_response
    return callback(request, **param_dict)
  File "C:\Program Files (x86)\Google\google_appengine\lib\django\django\views\defaults.py", line 79, in page_not_found
    return http.HttpResponseNotFound(t.render(RequestContext(request, {'request_path': request.path})))
  File "C:\Program Files (x86)\Google\google_appengine\lib\django\django\template\context.py", line 100, in __init__
    self.update(processor(request))
  File "C:\Program Files (x86)\Google\google_appengine\lib\django\django\core\context_processors.py", line 18, in auth
    'user': request.user,
AttributeError: 'WSGIRequest' object has no attribute 'user'

撰写回答