2013-12-17 13 views
8

Ho la seguente definizione della rotta in server.py mia boccetta di app:Flask percorso dando 404 con numeri in virgola mobile nella URL

@app.route('/nearby/<float:lat>/<float:long>') 
def nearby(lat, long): 
    for truck in db.trucks.find({'loc': {'$near': [lat, long]}}).limit(5): 
     if truck.has_key('loc'): 
      del truck['loc'] 
    return json.dumps(trucks) 

Ma quando vado a http://localhost:5000/nearby/37.7909470419234/-122.398633589404, ho ottenere un 404.

Gli altri percorsi funzionano bene, quindi è un problema con questo. Cosa sto facendo di sbagliato qui?

+0

I numeri più semplici funzionano? '/ Nei dintorni/42/42'? –

+2

Hai provato solo valori float positivi? Ricordo di aver letto sul routing di werkzeug che per i float, il negativo non è permesso. http://werkzeug.pocoo.org/docs/routing/ – codegeek

+0

@codegeek ha ragione. I numeri negativi non sono supportati. Come indicato qui: http://werkzeug.pocoo.org/docs/routing/#werkzeug.routing.FloatConverter –

risposta

8

Poiché il FloatConverter incorporato può gestire solo numeri positivi, passo le coordinate come stringhe e uso il metodo float() di Python per convertirli in float.

16

Il numero di serie FloatConverter non gestisce numeri negativi. Scrivi un convertitore personalizzato per gestire i negativi. Questo convertitore tratta anche gli interi come float, che avrebbero anche fallito.

from werkzeug.routing import FloatConverter as BaseFloatConverter 

class FloatConverter(BaseFloatConverter): 
    regex = r'-?\d+(\.\d+)?' 

# before routes are registered 
app.url_map.converters['float'] = FloatConverter 

Il built-in non gestisce interi perché poi /1 e /1.0 sarebbe puntare alla stessa risorsa. Perché non gestisce i valori negativi è meno chiaro.