2012-10-07 27 views
11

Tôi đang sử dụng URLconf của Django, URL tôi sẽ nhận được là /?code=authenticationcode
Tôi muốn để phù hợp với URL sử dụng r'^\?code=(?P<code>.*)$', nhưng nó không hoạt động.
Python regex với dấu hỏi đen

Sau đó, tôi phát hiện ra đó là vấn đề của '?'.
Do đó, tôi đã cố gắng đối sánh /aaa?aaa bằng cách sử dụng r'aaa\?aaa'r'aaa\\?aaa' thậm chí r'aaa.*aaa', tất cả đều không thành công nhưng hoạt động khi đó là "+" hoặc bất kỳ ký tự nào khác.
Cách đối sánh '?', Nó có đặc biệt không?

Trả lời

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

Lý do /aaa?aaa sẽ không khớp với URL của bạn là do ? bắt đầu truy vấn GET mới.

Vì vậy, phần phù hợp của URL chỉ tối đa 'aaa' đầu tiên. Phần còn lại '? Aaa' là một chuỗi truy vấn mới được phân tách bằng dấu '?' đánh dấu, chứa biến "aaa" được chuyển thành tham số GET.

Điều bạn có thể làm ở đây là mã hóa biến trước khi nó đi vào URL. Dạng được mã hóa là ?%3F.


Bạn cũng không được kết hợp truy vấn GET chẳng hạn như /?code=authenticationcode bằng cách sử dụng regex. Thay vào đó, hãy đối sánh URL của bạn tối đa / bằng cách sử dụng r'^$'. Django sẽ chuyển biến code làm tham số GET cho đối tượng request, mà bạn có thể có được trong chế độ xem của mình bằng cách sử dụng request.GET.get('code').

2

Bạn không được phép sử dụng ? trong URL dưới dạng giá trị biến. Các ? chỉ ra rằng có những biến sắp tới trong

Giống như:. http://www.example.com?variable=1&another_variable=2

Thay thế nó hay thoát khỏi nó. Đây là một số tốt đẹp documentation.

0

"Cách đối sánh '?', Nó có đặc biệt không?" Có, nhưng bạn đang thoát đúng cách bằng cách sử dụng dấu gạch chéo ngược. Tôi không nhìn thấy nơi bạn đã tính toán cho dấu gạch chéo về phía trước, mặc dù. bit chỉ cần được bổ sung trong:

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

ngăn chặn các metacharacters regex với []

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

gì xảy ra khi (s) anh quyết định "ngăn chặn" các metacharacters theo cách này: '[?^$]'? Thoát sẽ là cách tiếp cận tốt hơn. –

1

của Django urls.py không phân tích các chuỗi truy vấn, vì vậy không có cách nào để có được thông tin này tại file urls.py .

Thay vào đó, phân tích nó theo quan điểm của bạn:

def foo(request): 
    code = request.GET.get('code') 
    if code: 
     # do stuff 
    else: 
     # No code! 
Các vấn đề liên quan