2013-04-05 5 views
5

Ho un URL che ho bisogno di aggiungere una chiave API come parametro. La chiave contiene% e altri caratteri e non dovrebbe essere codificata con l'URL, esiste un modo per farlo con furl?Libreria Python Furl: esiste un modo per aggiungere un parametro a un url senza che l'URL lo codifichi?

Heres il mio codice corrente:

request_url = furl('http://www.domain.com/service/') \ 
    .add({ 
    'format'  : 'json', 
    'location'  : address_line_1 + ',' + city + ',' + state, 
    'key'   : APP_KEY 
}).url 
+0

Ma questi caratteri devono essere codificati in URL se si desidera che questo sia un URL valido (e funzionante). Immagina che la tua chiave API sia, ad esempio, '123% 456% 789'. Se usi semplicemente 'http: //www.domain.com/service/? Format = json & location = blah & key = 123% 456% 789', il server vedrà' key = 123E6x9'. – abarnert

+0

Probabilmente non lo stai facendo correttamente. Il motivo per usare una libreria di URL è che la codifica non è qualcosa di cui nemmeno tecnicamente devi essere a conoscenza. –

+0

@ChrisDutrow: Per essere onesti, 'furl' è progettato per permetterti di combinare stringhe di query create manualmente e a livello di programmazione (i loro primi esempi riguardano la creazione di un URL da una stringa che ha già" uno "= 1" sul fine, e quindi aggiungendo 'two = 2' in vari modi diversi). – abarnert

risposta

1

Ho un URL che ho bisogno di aggiungere una chiave API per come parametro. La chiave contiene% e altri caratteri e non dovrebbe essere codificata come URL

Questo non può essere vero. deve essere codificato con URL. Altrimenti, si finisce con un URL non valido o un URL che non significa quello che volevi.

Ad esempio, supponiamo che la chiave sia 123%456%789. Se si invia http://www.domain.com/service/?format=json&key=123%25456%25789, il servizio Web dall'altra parte otterrà 123%456%789, che avrà esito positivo. Se si invia semplicemente http://www.domain.com/service/?format=json&key=123%456%789, il servizio Web dall'altra parte otterrà 123E6x9, che avrà esito negativo.

Quindi, il tuo esempio è già corretto e non dovresti fare nulla.

Se, per qualche motivo, hai già codifica URL APP_KEY prima di arrivare qui ... beh, non farlo. Con un nome del genere, suppongo che sia un letterale costante appena copiato e incollato nel modulo, il che significa che devi codificarlo manualmente con l'URL e copiare e incollare il risultato. Non farlo e stai bene.

Se hai il APP_KEY in formato con codifica URL, puoi sempre decodificarlo con, ad esempio, urlparse.parse_qs o anche con furl.

Ma se niente di tutto questo sembra ragionevole ...

c'è un modo per fare questo con Furl?

No. Vedere la sezione Encoding dei documenti. furl funziona solo su decodificato nomi e valori stringa di query.

Ma c'è un modo semplice per aggirare questo. Un URL non è una cosa complicata, e lo furl è progettato specificamente per permetterti di mischiare e abbinare i bit creati manualmente e programmaticamente. La maggior parte degli esempi nello README mostra esattamente questo, come ad esempio furl('http://www.google.com/?one=1').add({'two':2}).url. Quindi, se hai già un pre-codificato "key=123%25456%25789" da qualche parte, basta attaccarlo sulla stringa manualmente prima di darlo ai furl:

request_url = furl('http://www.domain.com/service/?key={}'.format(APP_KEY)) \ 
    .add({ 
    'format'  : 'json', 
    'location'  : address_line_1 + ',' + city + ',' + state, 
}).url 

Hacky? Beh, sì, nel senso che stai codificando lateralmente con lo furl, ma questo è esattamente quello che stai chiedendo come fare.

+0

Stavo lavorando con mapquest, sembra che la loro chiave API venga codificata con url. Ho deciso di decodificarlo con urllib e quindi includerlo nella funzione di aggiunta. –

+1

Sembra nella loro pagina Web "Gestisci AppKeys", lo mostrano pre-codificato. Che è sciocco. Penso che la cosa più pulita da fare sia decodificarla nell'interprete interattivo, quindi archiviare invece la versione decodificata nel programma, che è quello che sembra aver fatto. (Potrei aggiungere un commento che spieghi da cosa è stato decodificato e perché.) Ma incorporarlo nell'UR invece di usare 'furl' probabilmente sarebbe anche ragionevole. – abarnert

Problemi correlati