在同一个类中调用另一个def的def

时间:2014-05-23 17:51:30

标签: python function

我有下一个代码:

class UserMethods():
    @style.queue
    def checkAuth(db, user, password):
       self.addUser(db, user, password)

    @style.queue
    def addUser(db, user, password):
        salt = reduce(lambda x, y: x + y, [str(random.randint(0, 9)) for i in range(0, 5)])
        h = sha1(salt + password)
        password = salt + h.hexdigest()

        c = db.c
        c.execute('SELECT name FROM users WHERE name=?', (user, ))
        if c.fetchone() is not None:
            c.execute('UPDATE users SET password=? WHERE name=?', (password, user))
        else:
            c.execute('INSERT INTO users (name, password) VALUES (?, ?)', (user, password))

我不知道@ style.queue的目的是什么,但我认为这不相关。

但是self.addUser(db, user, password)的部分对我不起作用。如何在 checkAuth 中调用 addUser

错误是:

NameError:全局名称' addUser'没有定义 数据库错误@ checkAuth(' lroca',' asgard * 123 +'){}全球名称' addUser'未定义

1 个答案:

答案 0 :(得分:2)

Cameron和Wooble的评论是正确的。要解决当前问题,请添加self作为实例方法的第一个参数。这是更新的代码:

class UserMethods():
    @style.queue
    def checkAuth(self, db, user, password):
       self.addUser(db, user, password)

    @style.queue
    def addUser(self, db, user, password):
        salt = reduce(lambda x, y: x + y, [str(random.randint(0, 9)) for i in range(0, 5)])
        h = sha1(salt + password)
        password = salt + h.hexdigest()

        c = db.c
        c.execute('SELECT name FROM users WHERE name=?', (user, ))
        if c.fetchone() is not None:
            c.execute('UPDATE users SET password=? WHERE name=?', (password, user))
        else:
            c.execute('INSERT INTO users (name, password) VALUES (?, ?)', (user, password))

作为旁注:看来此程序可能接受userpassword的任意输入,因此可能容易受到SQL injection的攻击。<​​/ p>