2014-06-07 20 views
7

Tôi mới dùng Python và chỉ học nó khi tôi làm việc trong dự án này, và vấn đề này thực sự gây nhầm lẫn cho tôi. Đây là mã của tôi:Flask: TypeError: đối tượng 'int' không được gọi là

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

Tôi gọi /set/phone/40. Tất cả tốt cho đến nay. Sau đó, tôi gọi số /get/phone. Không tốt lắm. Đây là 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 

Sử dụng trình gỡ lỗi của bình, tôi có thể thấy trong khung hình cuối cùng, ứng dụng có vẻ là 40!

Làm thế nào để điều này xảy ra và làm cách nào để giải quyết?

+0

Bạn có nghĩa là 'trở lại str (devicedata [0]) '? – falsetru

+0

@falsetru Có vẻ như tôi đã làm! Điều đó giải quyết nó, cảm ơn! – JJJollyjim

Trả lời

11

Bạn nên trả về một đối tượng chuỗi, không phải là một đối tượng int:

Thay thế dòng sau:

return devicedata[0] 

với:

return str(devicedata[0]) 

Hoặc, thay thế các dòng sau :

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

với:

data[device] = (str(battery), datetime.now()) 
Các vấn đề liên quan