TypeError cu Django URL Regex

Bună, întotdeauna am fost confundat cu Regex și nu înțeleg răspunsurile la alte fire de ajutor.

Practic întrebarea mea este, pot să combin

r'^input/?$'

și

r'^input/index.html?$'

în asta?

r'^input(/(index.html?)?)?$'

În Django, am această eroare:

input() takes exactly 1 argument (3 given)

El oferă doar eroarea când se potrivește corect, deci poate că nu este o problemă de regex?

1

2 răspunsuri

Personal, aș prefera să nu combinăm cele două expresii regulate. Cred că având două modele url,

url(r'^input/?$', input, name="input"),
url(r'^input/index.html?$', input),

este mai ușor de citit decât unul.

Cu toate acestea, dacă doriți să combinați cele două, puteți utiliza paranteze care nu captează:

r'^input(?:/(?:index.html?)?)?$'

Un exemplu rapid ar putea explica:

>>> import re
>>> # first try the regex with capturing parentheses
>>> capturing=r'^input(/(index.html?)?)?$'
>>> # Django passes the two matching strings to the input view, causing the type error
>>> print re.match(capturing, "input/index.html").groups()
('/index.html', 'index.html')
>>> # repeat with non capturing parentheses
>>> non_capturing=r'^input(?:/(?:index.html?)?)?$'
>>> print re.match(non_capturing, "input/index.html").groups()
()

Consultați pagina Referință sintaxă avansată pentru expresii regulate pentru mai multe informații.

1
adăugat

Dacă utilizați acest lucru în urlpatterns , nu este necesar să scrieți simbolul ? pentru că tot ce vine după ce puteți analiza funcția de vizualizare. Și cererea de /input/index.html?param=2 va fi procesată corect cu regex r '^ input/index.html $' . Apoi, în funcția de vizualizare puteți obține parametri cum ar fi:

def my_view(request):
    param = request.GET.get('param', 'default_value')

Find more info here: https://docs.djangoproject.com/en/1.9/topics/http/urls/

0
adăugat
Python România
Python România
100 participanți

Comunitatea pasionaților de Python din România.