繁体   English   中英

如何使用Python对字符串进行编码和解码以在URL中使用?

[英]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

很难减小字符串的大小并保留任意内容。

您必须将数据限制为可以有效压缩的内容。

您可以选择执行以下操作。

  1. 将“URL中的所有参数”保存在数据库行中。

  2. 为此参数集分配GUID键。

  3. 然后提供缩短的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM