it-swarm.com.de

Python-Flasche, TypeError: 'dict'-Objekt ist nicht aufrufbar

Mit einem Problem, das anscheinend weit verbreitet ist, habe ich meine Nachforschungen gemacht und sehe nicht, dass es irgendwo genau neu erstellt wird. Wenn ich json.loads(rety.text) drucke, sehe ich die Ausgabe, die ich brauche. Wenn ich jedoch return anrufe, zeigt es mir diesen Fehler. Irgendwelche Ideen? Hilfe wird sehr geschätzt und danke. Ich verwende die Flasche MethodHandler.

class MHandler(MethodView):
    def get(self):
        handle = ''
        tweetnum = 100

        consumer_token = '' 
        consumer_secret = ''
        access_token = '-'
        access_secret = ''

        auth = tweepy.OAuthHandler(consumer_token,consumer_secret)
        auth.set_access_token(access_token,access_secret)

        api  = tweepy.API(auth)

        statuses = api.user_timeline(screen_name=handle,
                          count= tweetnum,
                          include_rts=False)

        pi_content_items_array = map(convert_status_to_pi_content_item, statuses)
        pi_content_items = { 'contentItems' : pi_content_items_array }

        saveFile = open("static/public/text/en.txt",'a') 
        for s in pi_content_items_array: 
            stat = s['content'].encode('utf-8')
            print stat

            trat = ''.join(i for i in stat if ord(i)<128)
            print trat
            saveFile.write(trat.encode('utf-8')+'\n'+'\n')

        try:
            contentFile = open("static/public/text/en.txt", "r")
            fr = contentFile.read()
        except Exception as e:
            print "ERROR: couldn't read text file: %s" % e
        finally:
            contentFile.close()
        return lookup.get_template("newin.html").render(content=fr) 

    def post(self):
        try:
            contentFile = open("static/public/text/en.txt", "r")
            fd = contentFile.read()
        except Exception as e:
            print "ERROR: couldn't read text file: %s" % e
        finally:
                contentFile.close()
        rety = requests.post('https://gateway.watsonplatform.net/personality-insights/api/v2/profile', 
                auth=('---', ''),
                headers = {"content-type": "text/plain"},
                data=fd
            )

        print json.loads(rety.text)
        return json.loads(rety.text)


    user_view = MHandler.as_view('user_api')
    app.add_url_rule('/results2', view_func=user_view, methods=['GET',])
    app.add_url_rule('/results2', view_func=user_view, methods=['POST',])

Hier ist der Traceback (Denken Sie daran, dass die Ergebnisse oben gedruckt werden):

Traceback (most recent call last):
  File "/Users/RZB/anaconda/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__
    return self.wsgi_app(environ, start_response)
  File "/Users/RZB/anaconda/lib/python2.7/site-packages/flask/app.py", line 1820, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "/Users/RZB/anaconda/lib/python2.7/site-packages/flask/app.py", line 1403, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/RZB/anaconda/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/RZB/anaconda/lib/python2.7/site-packages/flask/app.py", line 1478, in full_dispatch_request
    response = self.make_response(rv)
  File "/Users/RZB/anaconda/lib/python2.7/site-packages/flask/app.py", line 1577, in make_response
    rv = self.response_class.force_type(rv, request.environ)
  File "/Users/RZB/anaconda/lib/python2.7/site-packages/werkzeug/wrappers.py", line 841, in force_type
    response = BaseResponse(*_run_wsgi_app(response, environ))
  File "/Users/RZB/anaconda/lib/python2.7/site-packages/werkzeug/test.py", line 867, in run_wsgi_app
    app_rv = app(environ, start_response)
30
puhtiprince

Flask erwartet nur, dass Ansichten ein antwortähnliches Objekt zurückgeben. Dies bedeutet eine Response, eine Zeichenfolge oder ein Tuple, die den Body, den Code und die Header beschreibt. Sie geben ein Dikt zurück, das nicht eines dieser Dinge ist. Da Sie JSON zurückgeben, geben Sie eine Antwort mit der JSON-Zeichenfolge im Hauptteil und dem Inhaltstyp application/json zurück.

return app.response_class(rety.content, content_type='application/json')

In Ihrem Beispiel verfügen Sie bereits über eine JSON-Zeichenfolge, deren Inhalt von der von Ihnen gestellten Anforderung zurückgegeben wird. Wenn Sie jedoch eine Python-Struktur in eine JSON-Antwort konvertieren möchten, verwenden Sie jsonify:

data = {'name': 'davidism'}
return jsonify(data)

Hinter den Kulissen ist Flask eine WSGI-Anwendung, die aufrufbare Objekte erwartet, weshalb Sie diesen spezifischen Fehler erhalten: Ein Diktat kann nicht aufgerufen werden, und Flask weiß nicht, wie Sie es in etwas umwandeln können.

50
davidism

Verwenden Sie die Funktion Flask.jsonify, um die Daten zurückzugeben.

from flask import jsonify 
# ...
return jsonify(data)
10
Sahil Shah

Wenn Sie ein data, status, headers-Tuple aus einer Flask-Ansicht zurückgeben, ignoriert Flask derzeit den Statuscode und den content_type-Header, wenn die Daten bereits ein Antwortobjekt sind, wie z. B. das, was jsonify zurückgibt.

Der Inhaltstypheader wird nicht festgelegt:

headers = {
    "Content-Type": "application/octet-stream",
    "Content-Disposition": "attachment; filename=foobar.json"
}
return jsonify({"foo": "bar"}), 200, headers

Verwenden Sie stattdessen flask.json.dumps, um die Daten zu generieren (was jsonfiy intern verwendet).

from flask import json

headers = {
    "Content-Type": "application/octet-stream",
    "Content-Disposition": "attachment; filename=foobar.json"
}
return json.dumps({"foo": "bar"}), 200, headers

Oder arbeiten Sie mit dem Antwortobjekt:

response = jsonify({"foo": "bar"})
response.headers.set("Content-Type", "application/octet-stream")
return response

Wenn Sie jedoch das tun wollen, was diese Beispiele zeigen und JSON-Daten als Download bereitstellen, verwenden Sie stattdessen send_file.

from io import BytesIO
from flask import json
data = BytesIO(json.dumps(data))
return send_file(data, mimetype="application/json", as_attachment=True, attachment_filename="data.json")
3
firelynx

Anstatt zu versuchen, die Antwort zu jsonifizieren, funktionierte dies.

return response.content
0
l3o