接昨天,发现在python3里面,2次提供相同的url,hash的数值的确是不一致的。google了一下,发现这个是Python为了防止恶意攻击做的一个操作。 下面蓝框,如果要解除这个问题,建议使用hashlib模块。 好吧,直接找了下它的实现: https:docs。python。org3libraryhashlib。html 比较喜欢这个blake2b的实现,指定长度,而且加入key防止被暴力破解。 把这段代码引入到昨天的代码中,问题解决。贴代码importredisimportreimportjsonimporttimeimportcgifromredisimportStrictRedis,ConnectionPoolfromflaskimportFlask,jsonify,requestimportrequestsfromhashlibimportblake2bappFlask(name)defcreateurl():print(Cometothefunctioncreateurl())prefixhttp:127。0。0。1apiurlsuffixtime。strftime(YmdH:M:S,time。localtime())urlprefixsuffixprint(url)print(Comeoutofthefunctioncreateurl())returnurldefdohash(url):print(cometofunctiondohash(url))FILESHASHPERSONb57challenges设置一个keyhblake2b(digestsize10,personFILESHASHPERSON)设置加密长度及指定keyh。update(url。encode())primkeyh。hexdigest()print(thehashof{0}is{1}。format(url,primkey))print(comeoutoffunctiondohash(url))returnprimkeydefinsertintoredis(primkey,textcontent):mock把数据插入数据库,primkey和textcontentprint(cometofunctioninsertintoredis(primkey,textcontent))poolConnectionPool(hostlocalhost,port6379,db0,decoderesponsesTrue)rStrictRedis(connectionpoolpool)try:r。hset(document,primkey,json。dumps({content:textcontent}))except:return0print(comeoutoffunctioninsertintoredis(primkey,textcontent))return1defcheckurlifexist(url):mock检查逻辑print(cometofunctioncheckurlifexist(url))print(Thereceivedurlis{0}。format(url))keydohash(url)print(tosearchthiskey{0},checkifitexist。format(key))poolConnectionPool(hostlocalhost,port6379,db0,decoderesponsesTrue)rStrictRedis(connectionpoolpool)ifr。hexists(document,key):result1print(itexist)else:result0print(itnotexist)print(comeoutoffunctioncheckurlifexist(url))returnresultdefgettext(url):print(cometofunctiongettext(url))poolConnectionPool(hostlocalhost,port6379,db0,decoderesponsesTrue)rStrictRedis(connectionpoolpool)keydohash(url)textinfojsonr。hmget(document,key)print(textinfojson)debug,整个信息内容展示print(type(textinfojson))看看类型,原来是Listprint(textinfojson〔0〕)展示list中第一个元素内容print(type(textinfojson〔0〕))看看类型是strprint(json。loads(textinfojson〔0〕)〔content〕)把str类型转为字典,并读取字典里面key为content的内容textinfojson。loads(textinfojson〔0〕)〔content〕print(comeoutoffunctiongettext(url))returntextinfo1。保存文档:功能逻辑:接收前端请求,把文字存到数据库,并返回成功信息到后端。输入:{text:thisistheinfofortest}输出:{info:informationhasbeensuccessfulsaved}功能逻辑:1。获取输入2。把输入的text文档生成一个url3。把URL做hash,并把hash(url)作为key4。把{hash(url):text}存入数据库5。如果存储成功,则返回信息给到客户端redis表结构设计:{md5(url):text}app。route(apistoredoc,methods〔POST〕)defstoredoc():textcontentrequest。json〔text〕获取输入urlcreateurl()primkeydohash(url)ifinsertintoredis(primkey,textcontent)1:infoinsertintorediskey{0}{1}pairsuccess。format(url,textcontent)else:infosomethingerrorhashappenedreturnjsonify({info:info})2。编辑文档:功能逻辑:收集客户端的编辑请求,进入url并找到对应的数据,把text数据展示在前端,输入:{edit:http:127。0。0。1api202206100906}输出:{textinfo:thisistheinfofortest}供客户端逻辑把这个text数据做展示。21:接收输入的URL22:把URL做hash,并到数据库查找数据23:如果存在则返回数据,如果不存在则返回信息告诉不存在result0app。route(apieditdoc,methods〔POST〕)defeditdoc():urlrequest。json〔edit〕print(Wehavegottheinputurl,its{0}。format(url))ifcheckurlifexist(url)1:textinfogettext(url)print(info:thetextinfois{0}。format(textinfo))returnjsonify({info:theurlisexist,url:url})else:returnjsonify({info:theurl{0}isnotexist。format(url)})ifnamemain:app。run(host0。0。0。0,port8008,debugTrue) 前端插入效果 后台信息: 看到key是这个9265结尾的。 我用同一个url链接,反向找下对应的数值: 后端的日志:key没变 操作三次,查看数据库,信息是完备的。