2015-01-07 2 views
1

Попытка выяснить, что происходит между тем, когда я вызываю send_confirmation_instructions, и когда он вызывается со встроенной формой подтверждения подтверждения.Недопустимый токен подтверждения при попытке подтвердить электронную почту пользователя вручную с помощью Flask-Security

Вот вызов в моем новом окне пользователя:

newuser = User(
      email = newform.email.data, 
      first_name = newform.first_name.data, 
      last_name = newform.last_name.data, 
      business_name = newform.business_name.data, 
      roles = [Role.query.filter_by(id=role_id).first() for role_id in newform.roles.data], 
      active = True 
      ) 

     if newform.req_conf.data: 
      send_confirmation_instructions(newuser) 
     else: 
      newuser.confirmed_at = datetime.utcnow() 

и здесь встроенный вызов с точки зрения подтверждения отправки:

def send_confirmation(): 
    """View function which sends confirmation instructions.""" 

    form_class = _security.send_confirmation_form 

    if request.json: 
     form = form_class(MultiDict(request.json)) 
    else: 
     form = form_class() 

    if form.validate_on_submit(): 
     send_confirmation_instructions(form.user) 
     if request.json is None: 
      do_flash(*get_message('CONFIRMATION_REQUEST', email=form.user.email)) 

    if request.json: 
     return _render_json(form) 

    return _security.render_template(config_value('SEND_CONFIRMATION_TEMPLATE'), 
            send_confirmation_form=form, 
            **_ctx('send_confirmation')) 

Из того, что я могу сказать, все волшебство происходит с функцией: send_confirmation_instructions (пользователь)

и единственное различие, которое я могу сказать между тем, как я это называю, и как это называется Flask-Security, что я использую экземпляр пользователя, а встроенная функция использует form.user.

Отслеживание формы он использует, я не могу видеть, где form.user даже назначен:

class SendConfirmationForm(Form, UserEmailFormMixin): 

    submit = SubmitField(get_form_field_label('send_confirmation')) 

    def __init__(self, *args, **kwargs): 
     super(SendConfirmationForm, self).__init__(*args, **kwargs) 
     if request.method == 'GET': 
      self.email.data = request.args.get('email', None) 

    def validate(self): 
     if not super(SendConfirmationForm, self).validate(): 
      return False 
     if self.user.confirmed_at is not None: 
      self.email.errors.append(get_message('ALREADY_CONFIRMED')[0]) 
      return False 
     return True 

Я совершенно потерял сейчас, и поэтому я обращаюсь к ya'll помощи. Любые идеи, что я делаю неправильно?

ответ

1

Принято решение попытаться выполнить запись в базу данных, а затем отправить подтверждение, достаточно уверенное, что сработало. Не уверен, почему это изменило ситуацию, потому что из того, что я могу сказать, ни одна из функций не использует или не изменяет ничего в db, но, очевидно, я что-то пропускаю.

Изменен код следующим образом и все хорошо сейчас!

if newform.req_conf.data: 
     db.session.add(newuser) 
     db.session.commit() 
     send_confirmation_instructions(newuser) 
    else: 
     newuser.confirmed_at = datetime.utcnow() 
     db.session.add(newuser) 
     db.session.commit() 
+0

Удивительно полезно. Благодарю. – rob123