web-dev-qa-db-ja.com

Flask:TypeError: 'int'オブジェクトは呼び出せません

私はPythonに不慣れで、このプロジェクトに取り組んでいるときにそれを学んでいますが、この問題は本当に混乱しています。私のコードは次のとおりです。

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

/set/phone/40と呼びます。これまでのところすべて良いです。次に、/get/phoneを呼び出します。あまり良くない。トレースバックは次のとおりです。

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

フラスコのデバッガーを使用すると、最後のフレームでアプリが40になっていることがわかります。

一体どうやってこれが起こったのですか、そしてどうすればそれを解決できますか?

10
JJJollyjim

Intオブジェクトではなく、stringオブジェクトを返す必要があります。

次の行を置き換えます。

return devicedata[0]

と:

return str(devicedata[0])

または、次の行を置き換えます。

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

と:

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