Dans mon application Pylons, certains contenus se trouvent dans des URL ressemblant à http://mysite/data/31415. Les utilisateurs peuvent accéder directement à cette URL ou rechercher "31415" via la page de recherche. Mes contraintes, cependant, signifient que http://mysite/data/000031415 devrait aller à la même page que ci-dessus, comme devraient les recherches pour "0000000000031415." Puis-je supprimer les zéros en tête de cette chaîne dans Routes elle-même, ou dois-je effectuer cette substitution dans le fichier du contrôleur? S'il est possible de le faire dans routing.py, je préférerais le faire là-bas - mais je n'arrive pas à le comprendre à partir de la documentation que je suis en train de lire.Réécriture d'une URL avec substitution d'expressions régulières dans les itinéraires
1
A
Répondre
1
Vous pouvez réellement faire via conditional functions, car ils vous permettent de modifier les variables à partir de l'URL en place.
0
Je sais que je triche en introduisant une bibliothèque de routage différente, puisque je n'ai pas utilisé Routes
, mais voici comment cela est fait avec le paquet de routage Werkzeug
. Cela vous permet de spécifier qu'un fragment donné du chemin est un entier. Vous pouvez également implémenter un "convertisseur" plus spécialisé en héritant de werkzeug.routing.BaseConverter
, si vous voulez analyser quelque chose de plus intéressant (par exemple un UUID).
Peut-être, Routes
a un mécanisme similaire en place pour les besoins d'analyse de fragment de chemin spécialisé.
import unittest
from werkzeug.routing import Map, Rule
class RoutingWithInts(unittest.TestCase):
m = Map([Rule('/data/<int:record_locator>', endpoint='data_getter')])
def test_without_leading_zeros(self):
urls = self.m.bind('localhost')
endpoint, urlvars = urls.match('/data/31415')
self.assertEquals({'record_locator': 31415}, urlvars)
def test_with_leading_zeros(self):
urls = self.m.bind('localhost')
endpoint, urlvars = urls.match('/data/000031415')
self.assertEquals({'record_locator': 31415}, urlvars)
unittest.main()
Hmmm. Je pourrais essayer de contraindre la variable de routage dans un int, cela pourrait fonctionner. Merci pour la suggestion. –
@Sean M, il serait utile si vous avez posté votre code de coercition ici afin que d'autres ayant des difficultés similaires avec Routes bénéficieraient également. –
Je ne l'ai pas encore fait fonctionner, et je soupçonne que cette direction peut ne pas être productive. :( –