参数在传递给函数时从字典中消失
在我的函数中,我从会话中读取用户的数据,并把它们存储在一个字典里。接着,我把这个字典传给了注册功能的'register'函数,但这个函数却莫名其妙地接收到了一个空的字典,导致出现了KeyError错误。我的数据去哪儿了呢?以下是调用'register'函数的代码:
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)
而'register'函数的代码(完整源代码在这里: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 my@email.com
2010-07-09 19:24:35,020 DEBUG {'password1': u'a', 'email': u'my@email.com'}
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 {}
为什么数据会丢失呢?我是不是做错了什么?
@编辑给Silent-Ghost
register() takes exactly 2 arguments (3 given)
112. backend = request.session['backend']
113. logging.debug(backend)
114. user = backend.register(request, userdata)
3 个回答
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'my@email.com'}
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)
3
根据这个方法的定义:
- 你需要把字典里的内容拆开
- 你需要传入相关的
request
变量
大概是这样的:
backend.register(request, **userdata)
假设 register
是 backend
实例上的一个方法。
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']