2010-03-17 7 views
1

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

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() 
+0

Hmmm. Je pourrais essayer de contraindre la variable de routage dans un int, cela pourrait fonctionner. Merci pour la suggestion. –

+0

@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. –

+0

Je ne l'ai pas encore fait fonctionner, et je soupçonne que cette direction peut ne pas être productive. :( –