Python 为什么我的实体即使显示在仪表板上也没有显示在devserver上?

Python 为什么我的实体即使显示在仪表板上也没有显示在devserver上?,python,google-app-engine,google-cloud-datastore,Python,Google App Engine,Google Cloud Datastore,这是一个由多个部分组成的问题,我一直在使用Google App Engine编写一个博客,为了方便起见,我为博客创建了一个包含主题和文本的数据存储类。我想练习实现用户注册,因此为用户创建了另一个类,包含用户名、密码哈希、电子邮件和创建日期 这两个类在应用程序引擎上创建实体,并显示在仪表板上,但我的Users表(因为它是NoSql实现,我不知道该怎么称呼它)没有显示在我的本地devserver仪表板上 当我在Users表上运行查询时,即使用户名从未注册,它也会返回true 我还实现了一个登录功能

这是一个由多个部分组成的问题,我一直在使用Google App Engine编写一个博客,为了方便起见,我为博客创建了一个包含主题和文本的数据存储类。我想练习实现用户注册,因此为用户创建了另一个类,包含用户名、密码哈希、电子邮件和创建日期

  • 这两个类在应用程序引擎上创建实体,并显示在仪表板上,但我的Users表(因为它是NoSql实现,我不知道该怎么称呼它)没有显示在我的本地devserver仪表板上

  • 当我在Users表上运行查询时,即使用户名从未注册,它也会返回true

  • 我还实现了一个登录功能,它总是返回用户名或密码无效的消息,当然,只有当它们无效时才会出现,我知道当我输入它们时它们不是

这是我的数据存储实体代码

类博客(db.Model):
subject=db.StringProperty(必需=True)
blog=db.TextProperty(必需=True)
time\u created=db.DateTimeProperty(auto\u now\u add=True)
day\u created=db.DateProperty(自动\u now\u add=True)
类用户(db.Model):
username=db.StringProperty(必需=True)
pw_hash=db.StringProperty(必需=True)
emai=db.StringProperty()
user\u since=db.DateTimeProperty(auto\u now\u add=True)
@类方法
按用户id(cls、uid)定义的def:
返回用户。按用户id(uid)获取用户
@类方法
def按名称(cls,名称):
user=Users.all().filter('name=',name.get())
返回用户
@类方法
def寄存器(cls、名称、pw、电子邮件=无):
pw_h=make_pw_h(名称,pw)
返回用户(用户名=名称,
pw_hash=pw_h,
电子邮件=电子邮件)
@类方法
def登录(cls、名称、pw):
u=cls.BYU名称(名称)
如果u和检查_pw(pw):
返回u
这是注册新用户的函数

类注册(BaseHandler):
def get(自我):
render(“signup form.html”)
def post(自我):
have_error=False
self.username=self.request.get('username'))
self.password=self.request.get('password'))
self.verify=self.request.get('verify')
self.email=self.request.get('email'))
params=dict(username=self.username,
email=self.email)
如果无效,\u用户名(self.username):
params['error_username']=“这不是有效的用户名。”
have_error=True
如果密码(self.password)无效:
params['error_password']=“该密码无效。”
have_error=True
elif self.password!=自我验证:
params['error_verify']=“您的密码不匹配。”
have_error=True
如果电子邮件(self.email)无效:
params['error_email']=“这不是有效的电子邮件。”
have_error=True
如果有错误:
render('signup-form.html',**params)
其他:
u=db.GqlQuery(“从username='self.username'所在的用户中选择用户名”)
如果你:
msg=“用户已存在”
render('signup-form.html',error\u username=msg)
其他:
sing_user=Users.register(self.username、self.password、self.email)
sing_user.put()
#self.login(sing_用户)
self.set_secu_coki('user-id',sing_user.key().id())
self.redirect(“/welcome”)
这是用户登录的函数

类登录(BlogHandler):
def get(自我):
render('login-form.html')
def post(自我):
username=self.request.get('username')
password=self.request.get('password')
u=用户登录名(用户名、密码)
如果你:
自我登录(u)
self.redirect(“/blog”)
其他:
msg='无效登录'
render('login-form.html',error=msg)
这是我的BaseHandler函数,它继承了webapp2类

class BaseHandler(webapp2.RequestHandler):
    def render(self, template, **kw):
        self.response.out.write(render_str(template, **kw))

    def write(self, *a, **kw):
        self.response.out.write(*a, **kw)

    def set_sec_coki(self, name, val):
        sec_val = make_secure_val(str(val))
        self.response.headers.add_header('Set-Cookie', "%s=%s; Path=/" % (name,sec_val))

    def read_secure_cookie(self, name):
        cookie_val = self.request.cookies.get(name)
        return cookie_val and check_secure_val(cookie_val)

    def login(self, user):
        self.set_secure_cookie('user_id', str(user.key().id()))

    def logout(self):
        self.response.headers.add_header('Set-Cookie', 'user_id=; Path=/')
这些是我用来散列和盐饼干和密码的较小的函数

def make_secure_val(val):
    return '%s|%s' % (val, hmac.new(secret, val).hexdigest())

def check_secure_val(sec_val):
    val = sec_val.split('|')[0]
    if sec_val == make_secure_val(val):
        return val

def make_salt():
    chars = string.ascii_uppercase + string.ascii_lowercase + string.digits
    return ''.join(random.choice(chars) for x in range(5))

def make_pw_h(name, pw, salt = None):
    if salt is None:
        salt = make_salt()
    return "%s,%s" % (salt, hashlib.sha256(name + pw + salt).hexdigest())

def check_pw_h(name, pw, h):
    h = h.split(',')[1]
    return h == make_pw_h(name, pw, h)

您获取用户的查询错误:

这:

应更改为以下内容:

u = db.GqlQuery("SELECT username FROM Users WHERE username = :1", self.username)

请查看

获取用户的查询错误:

这:

应更改为以下内容:

u = db.GqlQuery("SELECT username FROM Users WHERE username = :1", self.username)

看看

@马丁谢谢你的建议。@马丁谢谢你的建议。我刚试过,但没有用。谢谢你的回答。它仍在返回,用户已经存在。您是否可以调试代码,查看self.username是什么,并确保传递的值正确。我刚刚尝试过,但没有效果。谢谢你的回答。它仍在返回,用户已存在。能否调试代码,查看self.username是什么,并确保传递的值正确。