2011-07-15 99 views
2

有一个错误信息我无法理解,因为我没有看到我的代码在哪里调用它。将用户对象与dev_appserver的Google应用引擎结合使用时出现。你能告诉我这是什么意思吗?帮助错误信息

ERROR 2011-07-15 15:01:07,664 __init__.py:463] 'User' object has no attribute '_User__email' 
Traceback (most recent call last): 
    File "/media/Lexar/projects/google/appengine/ext/webapp/__init__.py", line 700, in __call__ 
    handler.get(*groups) 
    File "/media/Lexar/projects/myproject/i18n.py", line 313, in get 
    self.response.out.write(template.render(path, template_values)) 
    File "/media/Lexar/projects/google/appengine/ext/webapp/template.py", line 73, in render 
    return t.render(Context(template_dict)) 
    File "/media/Lexar/projects/google/appengine/ext/webapp/template.py", line 115, in wrap_render 
    return orig_render(context) 
    File "/media/Lexar/projects/lib/django_1_2/django/template/__init__.py", line 173, in render 
    return self._render(context) 
    File "/media/Lexar/projects/lib/django_1_2/django/template/__init__.py", line 167, in _render 
    return self.nodelist.render(context) 
    File "/media/Lexar/projects/lib/django_1_2/django/template/__init__.py", line 796, in render 
    bits.append(self.render_node(node, context)) 
    File "/media/Lexar/projects/lib/django_1_2/django/template/__init__.py", line 809, in render_node 
    return node.render(context) 
    File "/media/Lexar/projects/lib/django_1_2/django/template/loader_tags.py", line 139, in render 
    return self.template.render(context) 
    File "/media/Lexar/projects/lib/django_1_2/django/template/__init__.py", line 173, in render 
    return self._render(context) 
    File "/media/Lexar/projects/lib/django_1_2/django/template/__init__.py", line 167, in _render 
    return self.nodelist.render(context) 
    File "/media/Lexar/projects/lib/django_1_2/django/template/__init__.py", line 796, in render 
    bits.append(self.render_node(node, context)) 
    File "/media/Lexar/projects/lib/django_1_2/django/template/__init__.py", line 809, in render_node 
    return node.render(context) 
    File "/media/Lexar/projects/lib/django_1_2/django/template/defaulttags.py", line 258, in render 
    return self.nodelist_true.render(context) 
    File "/media/Lexar/projects/lib/django_1_2/django/template/__init__.py", line 796, in render 
    bits.append(self.render_node(node, context)) 
    File "/media/Lexar/projects/lib/django_1_2/django/template/__init__.py", line 809, in render_node 
    return node.render(context) 
    File "/media/Lexar/projects/lib/django_1_2/django/template/__init__.py", line 849, in render 
    return _render_value_in_context(output, context) 
    File "/media/Lexar/projects/lib/django_1_2/django/template/__init__.py", line 829, in _render_value_in_context 
    value = force_unicode(value) 
    File "/media/Lexar/projects/lib/django_1_2/django/utils/encoding.py", line 66, in force_unicode 
    s = unicode(s) 
    File "/media/Lexar/projects/google/appengine/api/users.py", line 188, in __unicode__ 
    return unicode(self.nickname()) 
    File "/media/Lexar/projects/google/appengine/api/users.py", line 152, in nickname 
    if (self.__email and self.__auth_domain and 
AttributeError: 'User' object has no attribute '_User__email' 

编辑:错误消失,当我删除此代码:

'user_url': users.create_logout_url(self.request.uri) if users.get_current_user() else 'login','user' : users.get_current_user(),

所以按说我使用User对象做一些错误

更新:它似乎有与我申请的monkeypatch有关。删除这部分删除错误,所以我想知道我是否仍然需要此修补程序。它在

def _user_init(self, email=None, _auth_domain=None, 
      _user_id=None, federated_identity=None, federated_provider=None, 
      _strict_mode=True): 

    if not _auth_domain: 
    _auth_domain = os.environ.get('AUTH_DOMAIN') 
    assert _auth_domain 

    if email is None and federated_identity is None: 
    email = os.environ.get('USER_EMAIL', email) 
    _user_id = os.environ.get('USER_ID', _user_id) 
    federated_identity = os.environ.get('FEDERATED_IDENTITY', 
             federated_identity) 
    federated_provider = os.environ.get('FEDERATED_PROVIDER', 
             federated_provider) 

    if not email and not federated_identity and _strict_mode: 
    raise UserNotFoundError 

    self.__email = email 
    self.__federated_identity = federated_identity 
    self.__federated_provider = federated_provider 
    self.__auth_domain = _auth_domain 
    self.__user_id = _user_id or None 

users.User.__init__ = _user_init 

相关线程报告,其中猴补丁来自 How do I apply a monkeypatch to GAE?

+1

我很困惑你的更新信息。这个补丁看起来总是为用户的.__ email(= User._User__email)赋值,所以我很惊讶你没有它就得到一个User对象。我想了一下,如果你可以用错误的方式应用这个补丁,那么*删除*它不应该解决问题...令人困惑的确...: -/ – mac

+0

我也很困惑代码的作用以及我是否应该保留它。我不明白代码,我只是需要粘贴,现在我不会再去封闭它,因为这个问题可能已经被SDK解决了。 –

+1

我的理念是,如果代码通过了它所设计的测试,并且该补丁不能解决安全问题,那么我从不补丁。原因在于有时补丁会对代码的其他部分的工作产生微妙的影响(因为它看起来就是这种情况),并且您可以轻松地获得在升级到主要软件版本时打破的代码将不再需要。这是我爱上测试驱动开发的众多原因之一,顺便说一句! :) – mac

回答

1

我猜你的错误是在某个模块的进口时间:

ERROR 2011-07-15 15:01:07,664 __init__.py:463] 'User' object has no attribute '_User__email' 

__init__.py是定义文件一个目录是一个模块包。

您可以查找其中包含User对象的行#463或选择性地删除导入以了解哪个软件包存在问题。

我猜想,用于固定它,你需要确保当User对象确实有_User__email(这是__emailmangled name)属性,但不知道如何作出这样的产生很难错误呼叫说...

+1

只是fyi,'_User__email'属性是由python的[双下划线名称来自'User .__ email'的定义的[mangling](http://docs.python.org/tutorial/classes.html#private-variables)。 – senderle

+0

如果我不使用用户对象,如果我使用User对象注释掉错误消失,则错误消失:'...'user_url':users.create_logout_url(self.request.uri)if users.get_current_user ()else'login','user':users.get_current_user(),...' –

+1

@senderle - 好点,我直接将它包含在答案中。 – mac