2015-12-03 21 views
13

Yaygın görünen bir soruna sahip olmakla birlikte, araştırmamı yaptım ve her yerde tam olarak yeniden oluşturulmadığını görmüyorum. json.loads(rety.text)'u yazdırdığımda, ihtiyacım olan çıktıyı görüyorum. Yine de iadeyi aradığımda, bana bu hatayı gösteriyor. Herhangi bir fikir? Yardım büyük beğeni ve teşekkür ederim. Flask MethodHandler kullanıyorum.Python Flask, TypeError: 'dict' nesnesi callable değil

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

İşte traceback olan (yukarıda yazdırıyorsanız aklın sonuçlarında tutun):

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) 

cevap

28

Flask only expects views to return a response-like object. Bu Response anlamı, bir dize veya vücut, kodu ve başlıkları anlatan bir demet. Bu şeylerden biri olmayan bir diksiyonu geri veriyorsun. JSON'u döndürdüğünüzden, vücuttaki JSON dizesiyle ve bir içerik türü olan application/json ile yanıt verin. Örnekte

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

, zaten bir JSON dizesi, yaptığınız isteği tarafından döndürülen içeriğe sahip. bir JSON yanıta bir Python yapısını dönüştürmek istediğiniz Ancak, jsonify kullanın: Sahne arkası

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

, Flask neden olduğu etrafında çağrılabilir nesneleri geçmesini bekliyor WSGI uygulama olduğunu Bu belirli bir hatayı al: Bir dict callable değil ve Flask, bir şeye nasıl dönüştürüleceğini bilmiyor.

+0

Teşekkür ederim Davidism, bu hatayı hafifletiyor gibi görünüyor. Ancak, şimdi, orijinal soruyla ilgisiz olabileceğinin farkına vardığım yeni bir hata alıyorum. Burada herhangi bir fikir var mı? {u'code ': 400, u'error': u'Bir satır 1'de geçersiz JSON girişi '} 127.0.0.1 - - [02/Dec/2015 23:39:34] "POST/results2 HTTP/1.1 "200 - – puhtiprince

+0

@puhtiprince, yaptığınız istek üzerine json, doğru yapmadığınızı söylüyor. 'Data = 'yerine' json =' yazmasını sağlamanız gerekiyor. – davidism

5

Verileri döndürmek için Flask.jsonify işlevini kullanın.

Örnek - dönüş jsonify (veri)

İlgili konular