【问题标题】:Arguments disappear from a dictionary when passed to a function传递给函数时,参数从字典中消失
【发布时间】:2011-03-14 00:13:16
【问题描述】:

在我的函数中,我从会话中读取用户数据并将它们存储在字典中。接下来,我将它从 registration.backend 发送到“注册”函数,但该函数以某种方式将其变为空并引发 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 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 {}

为什么数据可能会丢失?我是不是做错了什么?

@edit for Silent-Ghost

 register() takes exactly 2 arguments (3 given)

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

【问题讨论】:

    标签: python django session dictionary


    【解决方案1】:

    根据方法的签名判断:

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

    类似这样的:

    backend.register(request, **userdata)
    

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

    【讨论】:

    • 但我收到错误“函数寄存器()接受 2 个参数,3 个给定”:/
    • @muntu: 那是register的其他功能,不是你给我们看的那个
    【解决方案2】:

    无需在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 )吧?
    【解决方案3】:

    这完美的工作

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      • 2017-10-01
      • 2023-03-26
      • 2013-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多