2012-10-07 13 views
11

Używam Django URLconf URL otrzymam jest /?code=authenticationcode
Chcę dopasować URL przy użyciu r'^\?code=(?P<code>.*)$', ale to nie działa.
Python regex ze znakiem zapytania dosłownym

Potem dowiedziałem się, że jest to problem "?".
Becuase Próbowałem dopasować /aaa?aaa używając r'aaa\?aaa'r'aaa\\?aaa' nawet r'aaa.*aaa', wszystko się nie udało, ale działa, gdy jest to znak "+" lub jakakolwiek inna.
Jak dopasować znak "?", Czy jest wyjątkowy?

Odpowiedz

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

Powodem /aaa?aaa nie będzie pasował wewnątrz URL, ponieważ ? zaczyna nowe zapytanie GET.

Tak więc, dopasowywana część adresu URL to tylko pierwsza "aaa". Pozostałe "? Aaa" to nowy ciąg zapytania oddzielony przez "?" znacznik zawierający zmienną "aaa" przekazaną jako parametr GET.

To, co może tutaj, jest zakodować zmienną, zanim dotrze do adresu URL. Zakodowana postać ? to %3F.


Należy również nie pasuje do zapytania GET takich jak /?code=authenticationcode przy użyciu regex w ogóle. Zamiast tego dopasuj adres URL do /, korzystając z r'^$'. Django przekazuje zmienną code jako parametr GET do obiektu request, który można uzyskać w widoku przy użyciu request.GET.get('code').

2

Nie wolno używać adresu ? w adresie URL jako wartości zmiennej. ? wskazuje, że istnieją zmienne pochodzące w

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

Wymienić lub uciec. Oto kilka fajnych documentation.

0

"Jak dopasować"? ", Czy jest to wyjątkowe?" Tak, ale poprawnie uciekasz, używając odwrotnego ukośnika. Nie widzę jednak, gdzie byłeś odpowiedzialny za wiodący ukośnik. Że nieco po prostu musi być dodany w:

r'^/\?code=(?P<code>.*)$' 
0

wyciszyć regex metaznakami z []

>>> s 
'/?code=authenticationcode' 
>>> r=re.compile(r'^/[?]code=(.+)') 
>>> m=r.match(s) 
>>> m.groups() 
('authenticationcode',) 
+1

Co się dzieje, gdy (a) postanawia "stłumić" metaznaki w ten sposób: '[?^$]'? Uciekanie byłoby lepszym podejściem. –

1

Django urls.py nie analizować ciągi zapytań, więc nie ma sposobu, aby uzyskać te informacje w pliku urls.py .

Zamiast analizować go w widoku:

def foo(request): 
    code = request.GET.get('code') 
    if code: 
     # do stuff 
    else: 
     # No code! 
Powiązane problemy