Аргументы исчезают из словаря при передаче в функцию - PullRequest
3 голосов
/ 09 июля 2010

В своей функции я читаю данные пользователя из сессии и сохраняю их в словаре.Затем я отправляю его в функцию 'register' из registration.backend, но функция каким-то образом получает его пустым и выдает 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 {}

Почему данные могут отсутствовать?Я что-то не так делаю?

@ edit для 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 голосов
/ 09 июля 2010

Нет необходимости связываться с ** в методе 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']
3 голосов
/ 09 июля 2010

Судя по подписи метода:

  1. вам нужно распаковать свой словарь
  2. необходимо передать соответствующую request переменную

Примерно так:

backend.register(request, **userdata)

Предполагается, что register - это метод для экземпляра backend.

0 голосов
/ 09 июля 2010

это прекрасно работает

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...