Come sfuggire a un sottofondo all'interno di un URL con piramide
Domanda
Devo passare un sottofondo come parametro in un percorso generato dalla piramide. Ho provato a usare Urllib.Ecode e Urllib.Quote ma non è stato possibile trovare una "risorsa" in entrambi i casi.
Generazione del percorso:
mypath='a/b/c'
new_route = route_url('new_model_route', self.request, subpath=urllib.encode(mypath))
Il mio percorso:
config.add_route('new_model_route', '/model/new/{subpath}')
URL generato (con "risorsa non trovata errore")
http://127.0.0.1:6544/rnd2/model/new/a%2Fb%2Fc
So che ha a che fare con la fuga perché l'URL http://blah/model/new/a
lavori.
Soluzione
Il modello di percorso /model/new/{subpath}
non corrisponderebbe mai /model/new/a/b/c
Quindi non capisco perché saresti in grado di generare un URL per quel modello?
Tuttavia, è possibile passare il resto dell'URL come elementi.
config.add_route('new_model_route', '/model/new/{subpath}')
request.route_url('new_model_route', 'b', 'c', subpath='a')
# /model/new/a/b/c
D'altra parte, hai un'altra opzione. Puoi creare una nuova via per abbinare questi URL, come ad esempio:
config.add_route('new_model_route', '/model/new/*subpath')
# matches /model/new/a, /model/new/a/b, etc
request.route_url('new_model_route', subpath=('a', 'b', 'c'))
# /model/new/a/b/c
Se in realtà non volevi abbinare questi URL per qualche motivo, puoi aggiungere static=True
al add_route
chiama, il che significa che stai usando solo il route name
per generare URL ma non abbinarli alle richieste in arrivo.
subpath
e traverse
Essere speciale (questo è tutto documentato) ma se eri intenzionato a usare 'A/B/C' potresti usare qualcos'altro nel modello di rotta:
config.add_route('new_model_route', '/model/new/*rest')
# matches /model/new/a, /model/new/a/b, etc
request.route_url('new_model_route', rest='a/b/c')
# /model/new/a/b/c
Oh e dato che sono su un tiro, puoi usare l'approccio originale con un URL più semplice che potresti già avere nel tuo sistema.
config.add_route('new_model_route', '/model/new')
# matches /model/new only
request.route_url('new_model_route', 'a', 'b', 'c')
# /model/new/a/b/c