Back to site
Since 2004, our University project has become the Internet's most widespread web hosting directory. Here we like to talk a lot about web servers, web development, networking and security services. It is, after all, our expertise. To make things better we've launched this science section with the free access to educational resources and important scientific material translated to different languages.

Kako napraviti validaciju ulaza zaista komplikovanom

U svakoj veb aplikaciji morate da proverite valjanost vaših ulaznih podataka veoma pažljivo. Validacija podataka je veoma uobičajen zadatak i zato je iznenađujuće da postoji nekoliko validacionih biblioteka u Python-u (kao formencode) što uključuje validatore za uobičajene zadatke. Međutim, Trac ne ujedinjuje ni jednu od ovih biblioteka, pa tako svaki programer mora da napiše svoj kod za proveru.

Sada pogledajte kako komplikovano može da bude ukoliko želite da proverite da li niz sadrži samo karaktere od a-z, srednju crticu (‘-’), donju crtu (‘_’):

# Only alphanumeric characters (and [-_]) allowed for custom fieldname # Note: This is not pretty, but it works... Anyone have an easier way of checking ??? f_name, f_type = customfield[Key.NAME], customfield[Key.TYPE] match = re.search("[a-z0-9-_]+", f_name) length_matched_name = 0 if match != None: match_span = match.span() length_matched_name = match_span[1] - match_span[0] namelen = len(f_name) if (length_matched_name != namelen): raise TracError("Only alphanumeric characters allowed for custom field name (a-z or 0-9 or -_).")

Imajte na umu koliko je autor morao duboko da kopa po Python-oj ponovnoj biblioteci kako bi pronašao metod raspona(). Prvo je tržio prihvatljive podnizove, izračunao poziciju podniza, izveo dužinu podniza iz toga i proverio da li je dužina podniza jednaka dužini celog niza.

Napokon, barem je autor imao neke sumnje da li je njegovo rešenje najelegantnije (pogledajte drugi red u odlomku iznad). Dakle, jednostavniji način provere bi mogao da bude:

# Only alphanumeric characters (and [-_]) allowed for custom fieldname f_name, f_type = customfield[Key.NAME], customfield[Key.TYPE] match = re.search("([a-z0-9-_]+)", f_name) if (match == None) or (match.group(1) != f_name): raise TracError("Only alphanumeric characters allowed for custom field name (a-z or 0-9 or -_).")

Sada smo se otarasili svih indeksa. Ipak, možete doći do željenog rezultata mnogo jednostavnije koristeći pravilno regularne izraze:

# Only alphanumeric characters (and [-_]) allowed for custom fieldname f_name, f_type = customfield[Key.NAME], customfield[Key.TYPE] if re.search('^[a-z0-9-_]+$', f_name) == None: raise TracError("Only alphanumeric characters allowed for custom field name (a-z or 0-9 or -_).")

Naravno postoji re.match, ali se trudim da ga izbegnem zbog ličnih problema sa samim metodom - proizveo sam neke greške kada sam koristio re.match ranije.

Pitate se koji softver može da reši ovaj nered? Ovaj kod je deo priključka koji vam pomaže da rukovodite prilagođenim poljima za vaše Trac karte ( CustomFieldAdminPlugin ). Takođe, celokupan kvalitet kodova modula je prilično siromašan, pa ukoliko želite da provedete neko vreme učeći refaktorisanje, ovo je pravo mesto za početak.



Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.


Published (Last edited): 30-01-2013 , source: http://www.schwarz.eu/oss/wiki/2008/11/how--to-make-input-validation-really-complicated