2013-12-17 6 views
8

ich die folgende Route Definition in meiner Flasche App server.py haben:Flask Weg 404 mit Gleitkommazahlen in der URL geben

@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) 

Aber wenn ich zu http://localhost:5000/nearby/37.7909470419234/-122.398633589404 gehen, erhalte ich eine 404.

Die anderen Routen funktionieren gut, also ist es ein Problem mit diesem. Was mache ich hier falsch?

+0

Funktionieren einfachere Zahlen? '/ in der Nähe/42/42'? –

+2

Haben Sie nur positive Float-Werte ausprobiert? Ich erinnere mich an das Lesen auf Werkzeug Routing, dass für Floats, Negativ ist nicht erlaubt. http://werkzeug.pocoo.org/docs/routing/ – codegeek

+0

@codegeek hat Recht. Negative Zahlen werden nicht unterstützt. Wie hier angegeben: http://werkzeug.pocoo.org/docs/routing/#werkzeug.routing.FloatConverter –

Antwort

8

Da der integrierte FloatConverter nur positive Zahlen verarbeiten kann, übergebe ich die Koordinaten als Strings und benutze Pythons float() -Methode, um sie in Floats umzuwandeln.

16

Der eingebaute FloatConverter verarbeitet keine negativen Zahlen. Schreiben Sie einen benutzerdefinierten Konverter für Negative. Dieser Konverter behandelt Integer auch als Floats, was ebenfalls fehlgeschlagen wäre.

from werkzeug.routing import FloatConverter as BaseFloatConverter 

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

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

Der eingebaute in ganzen Zahlen nicht handhaben, weil dann /1 und /1.0 auf die gleiche Ressource zeigen würde. Warum es keine negativen Werte behandelt, ist weniger klar.