2012-08-30 26 views
14

Trong vòng một ứng dụng Flask, tôi có cuộc gọi ajax sau:Flask Python, cố gắng để trở lại danh sách hoặc dict để Ajax gọi

$.ajax({ 
      url: "{{ url_for('bookings.get_customer') }}", 
      type: "POST", 
      data: nameArray, 
      success: function(resp){ 
       console.log(resp) 
      } 
     }) 

Như bạn thấy, tôi đi qua một mảng dựa vào đó tôi sẽ tìm kiếm của tôi cơ sở dữ liệu mongo, sẽ trả lại hoặc không trả về một khách hàng.

Vì vậy, def trăn đó là trách nhiệm xử lý cuộc gọi ajax này là:

@bookings.route('/get_customer', methods=[ 'POST' ]) 
def get_customer(): 
    name = {} 
    for key, value in request.form.items(): 
    name[ key ] = value 

    customer_obj = customer_class.Customer() 
    results = customer_obj.search_customer(name) 

    return results  

Vì lý lẽ của, cho phép nói cuộc gọi customer_obj trả về danh sách sau đây:

[{'customer': { 
       u'first_name': u'Dave', 
       u'tel': u'0121212121458', 
       u'country': u'UK',  
       u'address2': u'Townington', 
       u'address3': u'Cityville', 
       u'email': u'[email protected]', 
       u'postcode': u'A10 5BC', 
       u'address1': u'10 High Street', 
       u'second_name': u'Smith' 
      }, 
'customer_id': u'DaveSmithA10 5BCCat_Vegas1346244086' 
}] 

Khi tôi cố gắng để trả lại cuộc gọi ajax này là

return results 

Tôi gặp lỗi sau:

TypeError: 'list' object is not callable 

Đây là traceback:

Traceback (most recent call last): 
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1701, in __call__ 
return self.wsgi_app(environ, start_response) 
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1689, in wsgi_app 
response = self.make_response(self.handle_exception(e)) 
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1687, in wsgi_app 
response = self.full_dispatch_request() 
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1361, in 
full_dispatch_request 
response = self.make_response(rv) 
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1450, in make_response 
rv = self.response_class.force_type(rv, request.environ) 
File "/usr/local/lib/python2.7/dist-packages/werkzeug/wrappers.py", line 711, in 
force_type 
response = BaseResponse(*_run_wsgi_app(response, environ)) 
File "/usr/local/lib/python2.7/dist-packages/werkzeug/test.py", line 818, in 
run_wsgi_app 
app_iter = app(environ, start_response) 
TypeError: 'list' object is not callable 

Có ai có bất cứ đề nghị?

Cảm ơn

+0

là mọi thứ tốt với thụt lề? có vẻ như 'kết quả trả về' không ở đúng vị trí trong mã của bạn ... –

+0

Xin chào, vâng, xin lỗi đó là lỗi đánh máy của tôi. Tôi đã sửa chữa nó ngay bây giờ. – Ste77

Trả lời

29

Flask không hy vọng rằng bạn sẽ trở lại list đối tượng từ chức năng nhìn của bạn. Hãy thử jsonify nó trước:

from flask import jsonify 

@bookings.route('/get_customer', methods=[ 'POST' ]) 
def get_customer(): 
    name = {} 
    for key, value in request.form.items(): 
     name[ key ] = value 

    customer_obj = customer_class.Customer() 
    results = customer_obj.search_customer(name) 

    return jsonify(customers=results)  
+0

Có, xin lỗi, tôi đã thử nghiệm gửi các dicts và danh sách để xem nó có tạo nên sự khác biệt nào không. Tôi đã cập nhật câu hỏi của mình để làm cho phù hợp, tôi bị lạc trong chi tiết :). Tôi sẽ thử đề xuất của bạn ngay bây giờ. – Ste77

+0

Đã cập nhật câu trả lời của tôi. –

+0

Bạn là một học giả và một gent, nó hoạt động. Tôi đã phải trả lại một dict như trái ngược với một danh sách - trở lại jsonify (** kết quả [0]), mà không phải là chính xác những gì tôi muốn, nhưng tôi có thể dễ dàng nhận được một workaround cho điều đó. Cảm ơn bạn. – Ste77

5

Bạn cần phải làm

return jsonify(result=your_result) 

Ngoài ra kiểm tra documentation mà có thể là thực sự hữu ích.

+0

Cảm ơn bạn đã liên kết. – Ste77

8

josonify works..but nếu bạn định truyền một mảng mà không có khóa 'results', bạn có thể sử dụng thư viện json từ python. Chuyển đổi sau hoạt động cho tôi ..

import json 

@app.route('/test/json') 
def test_json(): 
list = [ 
     {'a': 1, 'b': 2}, 
     {'a': 5, 'b': 10} 
     ] 
return json.dumps(list) 
+1

Một vấn đề với cách tiếp cận này là Flask sẽ gửi sai thêm tiêu đề 'Content-Type'. Nó sẽ được đặt thành 'text/html; charset = utf-8', thay vì 'application/json' đúng ngữ nghĩa –

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