2014-06-07 18 views
7

Sono nuovo di Python e lo sto imparando solo mentre lavoro su questo progetto, e questo problema mi sta davvero confondendo. Ecco il mio codice:Flask: TypeError: l'oggetto 'int' non è richiamabile

from flask import Flask 
from datetime import datetime 

# Setup app 
app = Flask(__name__) 

# Initialize data dict 
data = {} 

# Pretty-formats a time difference 
def formatdifference(delta): 
    seconds = delta.total_seconds() 
    if (seconds < 60): 
     return "{seconds} seconds ago" % {"seconds": seconds} 

    return "{minutes} minutes ago" % {"minutes": seconds/60} 

# Sets a device battery level 
@app.route("/set/<device>/<int:battery>") 
def set(device, battery): 
    data[device] = (battery, datetime.now()) 
    return "done" 

# Get's a device battery level 
@app.route("/get/<device>") 
def get(device): 
    if not device in data: 
     return "No heartbeats" 

    devicedata = data[device] 
    delta = datetime.now() - devicedata[1] 

    if (delta.total_seconds() > 10): 
     return "Last heartbeat {diff}" % {"diff": formatdifference(delta)} 

    return devicedata[0] 

if __name__ == "__main__": 
    app.run(debug=True, host='0.0.0.0') 

Io chiamo /set/phone/40. Tutto bene finora. Quindi chiamo /get/phone. Non così buono. Ecco il traceback:

TypeError: 'int' object is not callable 
Traceback (most recent call last): 
    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1836, in __call__ 
    return self.wsgi_app(environ, start_response) 
    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1820, in wsgi_app 
    response = self.make_response(self.handle_exception(e)) 
    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1403, in handle_exception 
    reraise(exc_type, exc_value, tb) 
    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1817, in wsgi_app 
    response = self.full_dispatch_request() 
    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1478, in full_dispatch_request 
    response = self.make_response(rv) 
    File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1577, in make_response 
    rv = self.response_class.force_type(rv, request.environ) 
    File "/usr/local/lib/python2.7/dist-packages/werkzeug/wrappers.py", line 825, in force_type 
    response = BaseResponse(*_run_wsgi_app(response, environ)) 
    File "/usr/local/lib/python2.7/dist-packages/werkzeug/test.py", line 855, in run_wsgi_app 
    app_iter = app(environ, start_response) 
TypeError: 'int' object is not callable 

Usando il debugger di pallone, posso vedere che nell'ultimo fotogramma, app sembra essere 40!

Come diavolo è potuto accadere, e come posso risolverlo?

+0

Vuoi dire 'str ritorno (DEVICEDATA [0])'? – falsetru

+0

@falsetru Sembra che lo faccia! Questo l'ha risolto, grazie! – JJJollyjim

risposta

11

Si dovrebbe restituire un oggetto stringa, non un oggetto int:

Sostituire la seguente riga:

return devicedata[0] 

con:

return str(devicedata[0]) 

Oppure, sostituire la seguente riga :

data[device] = (battery, datetime.now()) 

con:

data[device] = (str(battery), datetime.now()) 
Problemi correlati