我正在使用 Django 的 URLconf,我将收到的 URL 是/?code=authenticationcode
我想使用匹配的 URL r'^\?code=(?P<code>.*)$'
,但它不起作用。
然后我发现这是'?'的问题。
因为我尝试/aaa?aaa
使用r'aaa\?aaa'
r'aaa\\?aaa'
even进行匹配r'aaa.*aaa'
,都失败了,但是当它是“+”或任何其他字符时它可以工作。
'?'怎么配,有没有特别的?
>>> s="aaa?aaa"
>>> import re
>>> re.findall(r'aaa\?aaa', s)
['aaa?aaa']
原因/aaa?aaa
在您的 URL 中不匹配是因为 a?
开始了一个新的 GET 查询。
因此,URL 的可匹配部分仅取决于第一个 'aaa'。剩下的 '?aaa' 是一个由 '?' 分隔的新查询字符串 标记,包含作为 GET 参数传递的变量“aaa”。
您可以在这里做的是在变量进入 URL 之前对其进行编码。的编码形式?
是%3F
。
您也不应该匹配 GET 查询,例如/?code=authenticationcode
使用正则表达式。相反,将您的 URL 与/
using匹配r'^$'
。Django 会将变量code
作为 GET 参数传递给request
对象,您可以在视图中使用request.GET.get('code')
.
不允许?
在 URL 中使用变量值。?
表示有变量进入。
像:http://www.example.com?variable=1&another_variable=2
替换它或逃避它。这是一些不错的文档。
Djangourls.py
不解析查询字符串,因此无法在urls.py
文件中获取此信息。
相反,在您的视图中解析它:
def foo(request):
code = request.GET.get('code')
if code:
# do stuff
else:
# No code!
“怎么搭配‘?’,有什么特别的吗?” 是的,但是您通过使用反斜杠正确地转义了它。不过,我看不出你在哪里解释了前导斜杠。该位只需要添加:
r'^/\?code=(?P<code>.*)$'
抑制正则表达式元字符[]
>>> s
'/?code=authenticationcode'
>>> r=re.compile(r'^/[?]code=(.+)')
>>> m=r.match(s)
>>> m.groups()
('authenticationcode',)