我正在调用一个函数来验证python中的表单,但是我收到了错误:
user = valid_username(username) NameError:全局名称' valid_username'没有定义。
代码:
class MainPage(Handler):
def valid_username(self,username):
print USER_RE.match(username)
return USER_RE.match(username)
def render_front(self,username="",password="",error=""):
logins = db.GqlQuery("SELECT * FROM logindb")
self.render("login.html",username=username,password=password,error=error,logins=logins)
def get(self):
self.render_front()
def post(self):
username = self.request.get("userID")
password = self.request.get("pass")
user = valid_username(username)
# pas = isvalid_password(password)
if user and password:
a = logindb(username = username,password=password)
a.put()
self.redirect("/")
else:
error = "we need both username and password"
self.render_front(username,password,error)
答案 0 :(得分:0)
valid_username
是一个类方法,这意味着它的名称在类名称空间中。但是python不会在类命名空间中查找变量,除非您明确告诉它这样做。当python看到:
user = valid_username(username)
它在本地方法范围中查找"valid_username"
,然后在模块范围中查找(混淆地称为“全局”)。由于它不在任何一个,你得到错误。
定义类方法时:
def valid_username(self,username):
self
变量位于本地函数作用域中,并引用类实例数据。您使用self
查找方法:
user = self.valid_username(username)
现在,python在本地函数作用域中查找self
,实现其类实例引用,并通过首先检查名称是否在实例变量中然后回退到类名称空间来继续查找(终于!)你的方法被定义了。