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