我正在使用Django的URLconf,我将收到的网址为/?code=authenticationcode
我想使用r'^\?code=(?P<code>.*)$'
匹配网址,但它不起作用。
然后我发现它是'?'的问题。
因为我尝试使用/aaa?aaa
r'aaa\?aaa'
甚至r'aaa\\?aaa'
来匹配r'aaa.*aaa'
,但都失败了,但是当它是“+”或任何其他角色时它会起作用。
如何匹配'?',这是特别的吗?
答案 0 :(得分:14)
>>> s="aaa?aaa"
>>> import re
>>> re.findall(r'aaa\?aaa', s)
['aaa?aaa']
/aaa?aaa
在您的网址中不匹配的原因是因为?
开始新的GET查询。
因此,URL的匹配部分仅限于第一个'aaa'。剩下的'?aaa'是一个由'?'分隔的新查询字符串 mark,包含作为GET参数传递的变量“aaa”。
?
的编码形式为%3F
。
您也应该使用正则表达式来匹配/?code=authenticationcode
等GET查询。相反,请使用/
将您的网址与r'^$'
匹配。 Django会将变量code
作为GET参数传递给request
对象,您可以使用request.GET.get('code')
在视图中获取该对象。
答案 1 :(得分:2)
您不能在URL中使用?
作为变量值。 ?
表示存在变量。
赞:http://www.example.com?variable=1&another_variable=2
更换或逃脱它。这里有一些不错的documentation。
答案 2 :(得分:1)
Django的urls.py
不解析查询字符串,因此无法在urls.py
文件中获取此信息。
相反,请在您的视图中解析它:
def foo(request):
code = request.GET.get('code')
if code:
# do stuff
else:
# No code!
答案 3 :(得分:0)
“如何匹配'?',这是特别的吗?” 是的,但是你通过使用反斜杠正确地逃避了它。但是,我没有看到你在哪里占据了领先的正斜线。这一点只需要添加:
r'^/\?code=(?P<code>.*)$'
答案 4 :(得分:0)
使用[]
>>> s
'/?code=authenticationcode'
>>> r=re.compile(r'^/[?]code=(.+)')
>>> m=r.match(s)
>>> m.groups()
('authenticationcode',)