0

我目前有一个有效的type签入retrieve_user方法。

  1. 我想为传入的新用户对象合并不区分大小写和...

  2. 检查条目(在这种情况下username为 a user)的拼写准确性 - 然后抛出一条Error错误拼写调试的消息。

我认为当 a拼写错误时,我NotFoundError应该抛出一个标志。username似乎这不起作用,因为拼写错误的用户名没有任何作用。

代码:

def create_user(self, username, password, firstname, lastname, email):
    new_user = User(username, password, firstname, lastname, email)
    self.session.add(new_user)
    self.session.commit()
    print(username, firstname, lastname) 

def retrieve_user(self, something_unique):
    if isinstance(something_unique, int):
        return self.session.query(User).\
        filter(User.user_id == something_unique).one()
    elif isinstance(something_unique, basestring):
        return self.session.query(User).\
        filter(func.upper((User.username == something_unique))).first() #<DOESNT WORK! results in no entry and no error message
        if NoResultFound:
            raise NotFoundError('No results found')
        elif MultipleResultsFound:
            raise MultipleResultsFound('Too many results found')
    elif isinstance(something_unique, User):
        return something_unique
    else:
        raise ValueError('Value being passed is an object')

问题1已解决: filter(func.lower(User.username) == func.lower(something_unique)).first()

4

1 回答 1

2

拼写准确性有点难以检查,并且可能是一项昂贵的操作。首先,您需要实现一个指标,该指标表示两个词彼此之间的接近程度。Levenshtein 距离是一个不错的选择。现在,当查找用户名失败时,您将不得不计算与所有用户名的距离 - 这可以通过仅包括前几个字符匹配的用户名来降低,因为这些用户不太可能被错误地输入。然后,您可以返回最接近的匹配项作为可能的用户名。

但请注意,恶意用户可能会使用此功能在您的系统中查找用户名

于 2015-09-10T23:28:04.360 回答