我正在尝试编写一个正则表达式来使用具有以下模式的字符串来标识令牌:
'eyAidXNlcl9pZCI6NywidG9rZW5fY3JlYXRpb25fdGltZSI6MTQyMDQ4NTUyMS4zNyB9%0A'
或
'eyJ1c2VyX2lkIjo3LCJ0b2tlbl9jcmVhdGlvbl90aW1lIjoxNDIwNDk0MTcxLjc5fQ%3D%3D'
我的django网址使用以下模式构建:
url(r'^(?P<object_id>\d+)/email/(?P<token>[a-f0-9]{100})/(?P<pk>\d+)/$', objects.ObjectDetail.as_view(), name="create-using-token"),
我无法弄清楚要解析令牌(?P<token>[a-f0-9]{100})
的正则表达式应该是什么,因为我不确定如何处理%
符号。我正在其他地方使用urllib
(特别是urllib.quote(string.encode("base64"))
)
我在shell中测试它的代码块如下:
import re
token = 'eyAidXNlcl9pZCI6NywidG9rZW5fY3JlYXRpb25fdGltZSI6MTQyMDQ4NTUyMS4zNyB9%0A'
pattern = '\w+\W+'
re.findall(pattern, token)
我尝试过使用[a-f0-9]{100}
,'\w+\W+'
和[\w|\W]
。这些非常接近,但我不确定如何处理这个%
符号,因为它们要么拆分,要么忽略%
之后的符号。
我正在使用以下方法生成令牌:
def generate_token():
now = time.time()
raw_string = '{{"random_number":{random_number},"token_creation_time":{now}}}'.format(
random_number=random_number,
now=now).strip()
token = raw_string.encode("base64")
return urllib.quote(token)
Per @ alecxe的建议我已尝试使用.rstrip('\n')
删除编码添加的\n
,但我仍需要能够识别包含%
符号的标记< / p>
答案 0 :(得分:2)
如果你取消引用%0A
,你会发现它是一个换行符:
>>> import urllib
>>> urllib.unquote('%0A')
'\n'
您可能不小心将其留在了令牌字符串中。我认为您不希望令牌包含它,因此您不需要在最后尝试将令牌与新行匹配。
查看generate_token()
函数。 base64
encoder的一个特性是在编码字符串的末尾添加一个尾随的换行符。脱掉它:
token = raw_string.encode("base64").rstrip('\n')