2010-07-09 54 views
3

在我的函数中,我从会话中读取用户数据并将它们存储在字典中。接下来,我将它从registration.backend发送到'register'函数,但函数以某种方式将其清空并引发KeyError。我的数据在哪里去了?从函数调用 '注册' 功能的代码:传递给函数时,参数从字典中消失

data = request.session['temp_data'] 
email = data['email'] 

logging.debug(email) 

password1 = data['password1'] 
userdata = {'email': email, 'password1': password1} 

logging.debug(userdata) 

backend = request.session['backend'] 

logging.debug(backend) 

user = backend.register(userdata) 

和寄存器功能(:http://bitbucket.org/ubernostrum/django-registration/src/tip/registration/backends/default/init.py整个源在这里):

class DefaultBackend(object): 
    def register(self, request, **kwargs): 
     logging.debug("backend.register") 
     logging.debug(kwargs) 

     username, email, password = kwargs['email'], kwargs['email'], kwargs['password1'] 

调试调用它们之后:

2010-07-09 19:24:35,020 DEBUG [email protected] 
2010-07-09 19:24:35,020 DEBUG {'password1': u'a', 'email': u'[email protected]'} 
2010-07-09 19:24:35,020 DEBUG <registration.backends.default.DefaultBackend object at 0x15c6090> 
2010-07-09 19:24:35,021 DEBUG backend.register 
2010-07-09 19:24:35,021 DEBUG {} 

为什么数据可能会丢失?难道我做错了什么 ?

@edit为静音鬼

register() takes exactly 2 arguments (3 given) 

112. backend = request.session['backend'] 
113. logging.debug(backend) 
114. user = backend.register(request, userdata) 

回答

3

无需在register方法中使用**。你想要做的是简单地传递词典register方法:

user = backend.register(request, userdata) # you need to pass request as definition says 

def register(self, request, userdata): # note lack of ** 
    logging.debug("backend.register") 
    logging.debug(userdata) # should work as expected 

    username, email, password = userdata['email'], userdata['email'], userdata['password1'] 
+0

这只是一个猜测,而是'后端'一个对象或类?尝试编写'backend()。register(request,userdata)'也许吧? – cji 2010-07-09 18:47:52

+0

太棒了,现在它的作品! – muntu 2010-07-09 18:50:04

3

由该方法的签名来看:

  1. 你需要解压你的字典
  2. 你需要通过相关request变量

类似这样的:

backend.register(request, **userdata) 

假设registerbackend实例的方法。

+0

但后来我收到提示“功能寄存器()接受2个参数,3给出”:/ – muntu 2010-07-09 17:44:52

+0

@muntu:那么它是一些其他的功能'注册',而不是你给我们的那个 – SilentGhost 2010-07-09 17:47:47

0

这很好地工作

class Logging(): 
    def debug(self,f): 
     print f 
class DefaultBackend(object): 
    def register(self, request, **kwargs): 
     logging.debug("backend.register") 
     logging.debug(kwargs) 

     username, email, password = kwargs['email'], kwargs['email'], kwargs['password1'] 

class Request: 
    def __init__(self): 
     self.session = {} 
request = Request() 
logging=Logging() 
request.session['temp_data']={'password1': u'a', 'email': u'[email protected]'} 
request.session['backend']=DefaultBackend() 



data = request.session['temp_data'] 
email = data['email'] 

logging.debug(email) 

password1 = data['password1'] 
userdata = {'email': email, 'password1': password1} 

logging.debug(userdata) 

backend = request.session['backend'] 

logging.debug(backend) 

user = backend.register(request,**userdata)