I\'m using Django\'s URLconf, the URL I will receive is /?code=authenticationcode
I want to match the URL using r\'^\\?code=(?P
.*)$\'
You are not allowed to use ?
in a URL as a variable value. The ?
indicates that there are variables coming in.
Like: http://www.example.com?variable=1&another_variable=2
Replace it or escape it. Here's some nice documentation.
>>> s="aaa?aaa"
>>> import re
>>> re.findall(r'aaa\?aaa', s)
['aaa?aaa']
The reason /aaa?aaa
won't match inside your URL is because a ?
begins a new GET query.
So, the matchable part of the URL is only up to the first 'aaa'. The remaining '?aaa' is a new query string separated by the '?' mark, containing a variable "aaa" being passed as a GET parameter.
What you can do here is encode the variable before it makes its way into the URL. The encoded form of ?
is %3F
.
You should also not match a GET query such as /?code=authenticationcode
using regex at all. Instead, match your URL up to /
using r'^$'
. Django will pass the variable code
as a GET parameter to the request
object, which you can obtain in your view using request.GET.get('code')
.
"How to match the '?', is it special?" Yes, but you are properly escaping it by using the backslash. I do not see where you have accounted for the leading forward slash, though. That bit just needs to be added in:
r'^/\?code=(?P<code>.*)$'
supress the regex metacharacters with []
>>> s
'/?code=authenticationcode'
>>> r=re.compile(r'^/[?]code=(.+)')
>>> m=r.match(s)
>>> m.groups()
('authenticationcode',)
Django's urls.py
does not parse query strings, so there is no way to get this information at the urls.py
file.
Instead, parse it in your view:
def foo(request):
code = request.GET.get('code')
if code:
# do stuff
else:
# No code!