[英]How does one encode and decode a string with Python for use in a URL?
我有一个像这样的字符串:
String A: [ 12234_1_Hello'World_34433_22acb_4554344_accCC44 ]
我想加密字符串A以在干净的URL中使用。 这样的事情:
String B: [ cYdfkeYss4543423sdfHsaaZ ]
python中是否有编码API,给定字符串A,它返回String B? 在python中是否有解码API,给定String B,它返回String A?
请注意,编码和加密之间存在巨大差异。
如果你想发送敏感数据,那么不要使用上面提到的编码;)
进行编码/解码的一种方法是使用包base64,例如:
import base64
import sys
encoded = base64.b64encode(sys.stdin.read())
print encoded
decoded = base64.b64decode(encoded)
print decoded
这是你在找什么? 根据您的具体情况,您将得到:
输入:12234_1_Hello'World_34433_22acb_4554344_accCC44
编码:MTIyMzRfMV9IZWxsbydXb3JsZF8zNDQzM18yMmFjYl80NTU0MzQ0X2FjY0NDNDQ =
已解码:12234_1_Hello'World_34433_22acb_4554344_accCC44
您是在加密,压缩还是只是urlencoding之后? 字符串可以在urlencoding之后传递,但这不会像在示例中那样变小。 压缩可能会缩小它,但您仍需要对结果进行urlencode。
您是否真的需要隐藏查看器中的字符串数据(例如,敏感数据,不应该被读取URL的人看到)?
要使它真的很短 - >只需在数据库中插入一行。 存储类似(id auto_increment, url)
元组的列表。 然后你可以base64
编码id来获得一个“代理网址”。 通过解码id并在数据库中查找正确的url来解码它。 或者,如果您不介意标识符看起来是顺序的,只需使用数字即可。
您是否希望加密字符串或对其进行编码以删除网址的非法字符? 如果是后者,你可以使用urllib.quote
:
>>> quoted = urllib.quote("12234_1_Hello'World_34433_22acb_4554344_accCC44")
>>> quoted
'12234_1_Hello%27World_34433_22acb_4554344_accCC44'
>>> urllib.unquote(quoted)
"12234_1_Hello'World_34433_22acb_4554344_accCC44"
从64版开始,base64模块为不同的字符串提供字符串的编码和解码。
在您的示例中,您将执行以下操作:
import base64
string_b = base64.b64encode(string_a)
string_a = base64.b64decode(string_b)
完整的API: http : //docs.python.org/library/base64.html
很难减小字符串的大小并保留任意内容。
您必须将数据限制为可以有效压缩的内容。
您可以选择执行以下操作。
将“URL中的所有参数”保存在数据库行中。
为此参数集分配GUID键。
然后提供缩短的GUID密钥。
另一种缩短字符串的方法是计算字符串的md5 / sha1哈希值(如果你愿意,可以与种子连接):
import hashlib
>>> hashlib.sha1("12234_1_Hello'World_34433_22acb_4554344_accCC44").hexdigest()
'e1153227558aadc00a2e90b5013fdd6b0804fdfb'
从理论上讲,你应该得到一组具有很少碰撞和固定长度的字符串。 hashlib
库有一个不同的哈希函数数组,您可以使用这种方式使用不同的输出大小。
编辑:你还说你需要一个可逆的字符串,所以这不适用于那个。 然而,Afaik,许多使用干净URL的网络平台似乎想要实现使用哈希函数来计算缩短的URL,然后将该URL与页面的其他数据一起存储以提供反向查找功能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.