我正在使用Flask-Python创建一个REST API。其中一个urls (/uploads)接受( POST HTTP请求)和一个JSON '{"src":"void","settings":"my settings"}‘。我可以单独提取每个对象,并将其编码为一个字节字符串,然后使用python中的hashlib对其进行哈希处理。然而,我的目标是获取整个字符串,然后进行编码,使其看起来像like...myfile.encode('utf-8')。打印我的文件显示如下{u‘’src‘:u’‘void’,u‘settings’:u‘’my settings'},有没有我可以接受上面的单码字符串,然后编码到utf-8到hashlib.sha1的字节序列(mayflies.encode(‘uff-8’)。一定要让我知道更多的澄清。提前谢谢。
fileSRC = request.json['src']
fileSettings = request.json['settings']
myfile = request.json
print myfile
#hash the filename using sha1 from hashlib library
guid_object = hashlib.sha1(fileSRC.encode('utf-8')) // this works however I want myfile to be encoded not fileSRC
guid = guid_object.hexdigest() //this works
print guid发布于 2015-08-21 14:08:27
正如您在评论中所说,您使用以下工具解决了问题:
jsonContent = json.dumps(request.json)
guid_object = hashlib.sha1(jsonContent.encode('utf-8'))但重要的是要理解为什么这样做是可行的。Flask sends you unicode() for non-ASCII, and str() for ASCII。使用JSON转储结果将为您提供一致的结果,因为它抽象了内部Python表示,就像只有unicode()一样。
Python 2
在Python2(您正在使用的Python版本)中,您不需要.encode('utf-8'),因为json.dumps()的ensure_ascii的默认值是True。当您将非ASCII数据发送到json.dumps()时,它将使用JSON转义序列来实际转储ASCII:不需要编码为UTF-8。此外,由于Zen of Python说“显式优于隐式”,即使ensure_ascii已经是True,您也可以指定它:
jsonContent = json.dumps(request.json, ensure_ascii=True)
guid_object = hashlib.sha1(jsonContent)Python 3
然而,在Python 3中,这将不再起作用。在Python3中,json.dumps()返回unicode,即使unicode字符串中的所有内容都是ASCII码。但hashlib.sha1只能在bytes上运行。您需要显式转换,即使ASCII编码是您所需要的全部:
jsonContent = json.dumps(request.json, ensure_ascii=True)
guid_object = hashlib.sha1(jsonContent.encode('ascii'))这就是为什么Python3是一种更好的语言:无论是str (Unicode)还是bytes,它都迫使您更加明确地说明所使用的文本。这就避免了以后的许多问题。
https://stackoverflow.com/questions/31658603
复制相似问题