Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:NoneType错误-“;强制使用Unicode:需要字符串或缓冲区,找到非类型;_Python_Google App Engine_Webapp2 - Fatal编程技术网

Python:NoneType错误-“;强制使用Unicode:需要字符串或缓冲区,找到非类型;

Python:NoneType错误-“;强制使用Unicode:需要字符串或缓冲区,找到非类型;,python,google-app-engine,webapp2,Python,Google App Engine,Webapp2,我正在使用Google App Engine并使用数据存储为用户创建一个表,其中包含实体用户名、密码哈希、电子邮件和加入日期。但是,当我运行一个函数来注册用户时,对密码进行散列的函数返回的是非类型错误 我试图查找错误,但表单正在发布值,我可以从标题中获取这些值 这是处理注册的一段代码 def make_salt(): chars=string.ascii\u大写+string.ascii\u小写+string.ascii\u数字 返回“”。加入(范围(5)内x的随机选择(字符)) def mak

我正在使用Google App Engine并使用数据存储为用户创建一个表,其中包含实体用户名、密码哈希、电子邮件和加入日期。但是,当我运行一个函数来注册用户时,对密码进行散列的函数返回的是非类型错误

我试图查找错误,但表单正在发布值,我可以从标题中获取这些值

这是处理注册的一段代码

def make_salt():
chars=string.ascii\u大写+string.ascii\u小写+string.ascii\u数字
返回“”。加入(范围(5)内x的随机选择(字符))
def make_pw_h(名称,pw,salt=无):
如果是盐:
盐=制盐
返回“%s,%s%”(salt,hashlib.sha256(name+pw+salt.hexdigest())
def检查_pw_h(名称,pw,h):
h=h.split(',')[1]
返回h==make_pw_h(名称,pw,h)
类用户(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
def使安全值:
返回“%s |%s%”(val,hmac.new(secret,val.hexdigest())
def检查安全值(秒值):
val=val.split(“|”)[0]
如果sec_val==使_安全_val(val):
返回值
类BaseHandler(webapp2.RequestHandler):
#此函数使用render_str函数在浏览器中显示html表单
def渲染(自身、模板,**kw):
self.response.out.write(render_str(模板,**kw))
#此函数是一个简单的函数,使用模板引擎用
#还有其他参数吗
def写入(自身,*a,**kw):
自响应输出写入(*a,**kw)
def set_sec_coki(自身、名称、val):
安全值=使安全值(val)
self.response.headers.add_cookie('Set-cookie',%s=%s;Path=/“%(名称,秒值))
def read_secu_coki(自我,姓名):
coki_val=self.request.cookies.get(名称)
返回coki值并检查coki值(coki值)
def初始化(自,*a,**kw):
webapp2.RequestHandler.Initialize(self,*a,**kw)
uid=self.read\u secu\u coki('user-id'))
self.user=uid和Users.by_id(int(uid))
类注册(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=用户。按名称(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”)
类WelcomePage(BaseHandler):
def get(自我):
coki_val=read_secu_coki('user-id'))
u_id=coki_val.检查安全(coki_val)
part_usr=u_id.by_id(int(u_id))
name=部分\ usr.username
render(“welcome.html”,username=name)
这是我试图通过表单注册新用户时得到的错误堆栈

Traceback (most recent call last):
File "/home/bigb/google_projects/google_appengine/lib/webapp2/webapp2.py", line 1536, in     __call__
rv = self.handle_exception(request, response, e)
File "/home/bigb/google_projects/google_appengine/lib/webapp2/webapp2.py", line 1530, in __call__
rv = self.router.dispatch(request, response)
File "/home/bigb/google_projects/google_appengine/lib/webapp2/webapp2.py", line 1278, in default_dispatcher
return route.handler_adapter(request, response)
File "/home/bigb/google_projects/google_appengine/lib/webapp2/webapp2.py", line 1102, in __call__
return handler.dispatch()
File "/home/bigb/google_projects/google_appengine/lib/webapp2/webapp2.py", line 572, in dispatch
return self.handle_exception(e, self.app.debug)
File "/home/bigb/google_projects/google_appengine/lib/webapp2/webapp2.py", line 570, in dispatch
return method(*args, **kwargs)
File "/home/bigb/google_projects/my-ramblings/blog.py", line 197, in post
sing_user = Users.register(self.username, self.password, self.email)
File "/home/bigb/google_projects/my-ramblings/blog.py", line 55, in register
pw_h = make_pw_h(name, pw)
File "/home/bigb/google_projects/my-ramblings/blog.py", line 32, in make_pw_h
return "%s,%s" % (salt, hashlib.sha256(name + pw + salt).hexdigest())
TypeError: coercing to Unicode: need string or buffer, NoneType found
只需两个参数,
name
pw
即可调用
make\u pw\u h()
。您将盐保留为默认值,
None

def make_pw_h(name, pw, salt = None):
    if salt:
        salt = make_salt()
    return "%s,%s" % (salt, hashlib.sha256(name + pw + salt).hexdigest())
这意味着
if salt:
测试为
False
,最终将
None
传递给
hashlib.sha256

也许您想测试
salt
是否未设置:

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())

感谢@MartijnPieters的帮助,但它打开了一个错误的潘多拉盒子。我仍然是一个不折不扣的人,我在不断学习。你真的帮了我很大的忙,我真是感激不尽。