12

我正在使用 Django 的 URLconf,我将收到的 URL 是/?code=authenticationcode
我想使用匹配的 URL r'^\?code=(?P<code>.*)$',但它不起作用。

然后我发现这是'?'的问题。
因为我尝试/aaa?aaa使用r'aaa\?aaa' r'aaa\\?aaa'even进行匹配r'aaa.*aaa',都失败了,但是当它是“+”或任何其他字符时它可以工作。
'?'怎么配,有没有特别的?

4

5 回答 5

14
>>> 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').

于 2012-10-07T07:36:00.713 回答
2

不允许?在 URL 中使用变量值。?表示有变量进入。

像:http://www.example.com?variable=1&another_variable=2

替换它或逃避它。这是一些不错的文档

于 2012-10-07T07:36:07.157 回答
1

Djangourls.py不解析查询字符串,因此无法在urls.py文件中获取此信息。

相反,在您的视图中解析它:

def foo(request):
   code = request.GET.get('code')
   if code:
      # do stuff
   else:
      # No code!
于 2012-10-07T07:46:53.777 回答
0

“怎么搭配‘?’,有什么特别的吗?” 是的,但是您通过使用反斜杠正确地转义了它。不过,我看不出你在哪里解释了前导斜杠。该位只需要添加:

r'^/\?code=(?P<code>.*)$'
于 2012-10-07T07:37:55.303 回答
0

抑制正则表达式元字符[]

>>> s
'/?code=authenticationcode'
>>> r=re.compile(r'^/[?]code=(.+)')
>>> m=r.match(s)
>>> m.groups()
('authenticationcode',)
于 2012-10-07T07:39:57.550 回答