2015-12-03 22 views
13

Có vấn đề dường như là phổ biến nhưng tôi đã thực hiện nghiên cứu của mình và không thấy nó được tái tạo chính xác ở bất cứ đâu. Khi tôi in json.loads(rety.text), tôi thấy đầu ra tôi cần. Tuy nhiên, khi tôi gọi lại, nó cho tôi thấy lỗi này. Bất kỳ ý tưởng? Trợ giúp được đánh giá cao và cảm ơn bạn. Tôi đang sử dụng Flask MethodHandler.Python Flask, TypeError: đối tượng 'dict' không được gọi là

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

Đây là Traceback (Hãy kết quả óc đang in trên):

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) 

Trả lời

28

Flask only expects views to return a response-like object. Điều này có nghĩa một Response, một chuỗi, hoặc một tuple mô tả cơ thể, mã, và các tiêu đề. Bạn đang trả lại một dict, đó không phải là một trong những điều đó. Vì bạn đang trả về JSON, trả về một phản hồi bằng chuỗi JSON trong phần nội dung và loại nội dung là application/json.

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

Trong ví dụ của bạn, bạn đã có một chuỗi JSON, nội dung trả về bởi các yêu cầu bạn thực hiện. Tuy nhiên, nếu bạn muốn chuyển đổi một cấu trúc Python để một phản ứng JSON, sử dụng jsonify:

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

Đằng sau hậu trường, Flask là một ứng dụng WSGI, mà hy vọng sẽ vượt qua đối tượng xung quanh callable, đó là lý do tại sao bạn nhận được lỗi cụ thể đó: một dict không thể gọi và Flask không biết cách biến nó thành cái gì đó.

+0

Cảm ơn bạn davidism, điều này dường như giảm thiểu lỗi. Tuy nhiên, bây giờ tôi nhận được một lỗi mới mà tôi nhận ra có thể không liên quan đến câu hỏi ban đầu. Có ý tưởng nào ở đây không? {u'code ': 400, u'error': đầu vào JSON không hợp lệ ở dòng 1, cột 2 '} 127.0.0.1 - - [02/Dec/2015 23:39:34] "POST/results2 HTTP/1.1 "200 - – puhtiprince

+0

@puhtiprince là json từ yêu cầu của bạn, nó nói rằng bạn đã không làm cho nó đúng. Bạn cần chuyển 'json =' để đăng, chứ không phải là 'data ='. – davidism

5

Sử dụng hàm Flask.jsonify để trả lại dữ liệu.

Ví dụ - trả lại jsonify (dữ liệu)

Các vấn đề liên quan