当字典被传递到函数中时,其中的参数会消失

3

在我的函数中,我从会话中读取用户的数据并将其存储在字典中。接下来,我将其发送到 registration.backend 中的 '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)

以下是注册函数的代码(完整代码请参见: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个回答

3

从方法的签名来看:

  1. 您需要解包字典
  2. 您需要传递相关的request变量

类似这样:

backend.register(request, **userdata)

假设registerbackend实例上的一个方法。

但是我得到了一个错误提示:“函数register()接受2个参数,但提供了3个”。 :/ - muntu
@muntu:那么它就是另一个函数“register”,而不是你向我们展示的那个。 - SilentGhost

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']

只是猜测,backend 是一个对象还是类?或许尝试编写 backend().register(request, userdata) - cji

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接