Ich verwende die URLconf von Django. Die URL, die ich erhalten werde, ist /?code=authenticationcode.
Ich möchte die URL mit r'^\?code=(?P<code>.*)$' abgleichen, aber es funktioniert nicht.

Dann fand ich heraus, dass es das Problem von '?' Ist.
Weil ich versucht habe, /aaa?aaa mit r'aaa\?aaa' r'aaa\\?aaa' sogar r'aaa.*aaa' abzugleichen, ist alles fehlgeschlagen, aber es funktioniert, wenn es "+" oder ein anderes Zeichen ist.
Wie passt das '?' Zu, ist es etwas Besonderes?

12
PlutoTX 7 Okt. 2012 im 11:31

5 Antworten

Beste Antwort
>>> s="aaa?aaa"
>>> import re
>>> re.findall(r'aaa\?aaa', s)
['aaa?aaa']

Der Grund, warum /aaa?aaa in Ihrer URL nicht übereinstimmt, ist, dass ein ? eine neue GET-Abfrage startet.

Der übereinstimmende Teil der URL ist also nur bis zum ersten 'aaa'. Das verbleibende '? Aaa' ist eine neue Abfragezeichenfolge , die durch das '?' Markierung, die eine Variable "aaa" enthält, die als GET-Parameter übergeben wird.

Was Sie hier tun tun können, ist, die Variable zu codieren, bevor sie in die URL gelangt. Die codierte Form von ? ist %3F.


Sie sollten auch eine GET-Abfrage wie /?code=authenticationcode überhaupt nicht mit Regex abgleichen. Passen Sie stattdessen Ihre URL mit r'^$' an / an. Django übergibt die Variable code als GET-Parameter an das Objekt request, das Sie in Ihrer Ansicht mit request.GET.get('code') erhalten können.

14
Anuj Gupta 11 Okt. 2012 im 11:37

Sie dürfen ? in einer URL nicht als Variablenwert verwenden. Das ? zeigt an, dass Variablen eingehen.

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

Ersetzen Sie es oder entkommen Sie ihm. Hier ist eine nette Dokumentation.

2
Thomas Schwärzl 7 Okt. 2012 im 07:36

Djangos urls.py analysiert keine Abfragezeichenfolgen, daher gibt es keine Möglichkeit, diese Informationen in der Datei urls.py abzurufen.

Analysieren Sie es stattdessen aus Ihrer Sicht:

def foo(request):
   code = request.GET.get('code')
   if code:
      # do stuff
   else:
      # No code!
1
Burhan Khalid 7 Okt. 2012 im 07:46

Unterdrücke die Regex-Metazeichen mit []

>>> s
'/?code=authenticationcode'
>>> r=re.compile(r'^/[?]code=(.+)')
>>> m=r.match(s)
>>> m.groups()
('authenticationcode',)
0
thkang 7 Okt. 2012 im 07:39

"Wie passt das '?' Zu, ist es etwas Besonderes?" Ja, aber Sie entkommen ihm ordnungsgemäß, indem Sie den Backslash verwenden. Ich sehe jedoch nicht, wo Sie für den führenden Schrägstrich verantwortlich sind. Das Bit muss nur hinzugefügt werden in:

r'^/\?code=(?P<code>.*)$'
0
Kenneth K. 7 Okt. 2012 im 07:37