2015-12-26 10 views
6

(Đây có lẽ là một câu hỏi ngớ ngẩn, vì vậy hãy đeo lá chắn ngu ngốc của bạn!) Tôi đã là một lập trình PHP và bây giờ đang học Python + Flask. Gần đây tôi đã phải đấu tranh rất nhiều với việc đăng dữ liệu thông qua AJAX và trả về một phản hồi. Cuối cùng, các mã mà làm việc là:Tại sao json.dumps() phải trong Flask?

@app.route('/save', methods=['POST']) 
def save_subscriptions(): 
    if request.method == 'POST': 
     sites = request.form.get('selected') 
     print(sites) 
     sites = sites[0:-1]   
     g.cursor.execute('UPDATE users SET sites = %s WHERE email = %s', [sites, session.get('email')]) 
     g.db.commit() 
     return json.dumps({'status': 'success'}) 

Nếu tôi thay đổi return json.dumps({'status': 'success'}) để return 1 tôi nhận được một ngoại lệ mà int is not callable. Trước hết, tôi không hiểu ai đang cố gắng gọi đó là int và tại sao? Thứ hai, trong PHP, nó thường xuyên có thể chỉ echo 1; và điều này sẽ trở thành phản ứng AJAX. Tại sao không return 1 hoạt động trong Flask, sau đó?

+2

Hãy vệ sinh các truy vấn SQL của bạn! –

+0

@WillSherwood Cảm ơn! Tôi đã tự hỏi ngày hôm qua những gì đã được tương đương với báo cáo chuẩn bị của PHP nhưng đã không cho nó nhiều suy nghĩ vì nó là một dự án cá nhân. Tôi sẽ thay đổi điều này! – dotslash

+0

@WillSherwood Xin chào, đợi một chút! Tôi nhìn vào http://bobby-tables.com/python.html và tự hỏi liệu các truy vấn của tôi chưa được khử trùng hay chưa. Tôi cần phải làm gì khác? – dotslash

Trả lời

7

Logic đằng sau những gì nên được trả lại bởi Flask xem is described in the docs một cách chi tiết:

Giá trị trả về từ một hàm view được tự động chuyển thành một đối tượng đáp ứng cho bạn. Nếu giá trị trả về là một chuỗi, thì đó là được chuyển đổi thành đối tượng phản hồi có chuỗi là nội dung phản hồi, mã lỗi 200 OK và văn bản html/html. Logic rằng Flask áp dụng cho chuyển đổi các giá trị trở lại thành các đối tượng phản ứng là như sau:

  • Nếu một đối tượng phản ứng của đúng loại được trả lại nó trực tiếp trở về từ xem.

  • Nếu đó là chuỗi, đối tượng phản hồi được tạo với dữ liệu đó và thông số mặc định.

  • Nếu một bộ được trả lại, các mục trong bộ dữ liệu có thể cung cấp thêm thông tin. Các bộ dữ liệu như vậy phải có dạng (phản hồi, trạng thái, tiêu đề) trong đó ít nhất một mục có để nằm trong bộ dữ liệu. Giá trị trạng thái sẽ ghi đè mã trạng thái và các tiêu đề có thể là danh sách hoặc từ điển của các giá trị tiêu đề bổ sung.

  • Nếu không có công cụ nào hoạt động, Bình sẽ giả định giá trị trả lại là ứng dụng WSGI hợp lệ và chuyển đổi thành đối tượng phản hồi.

Trong trường hợp của bạn, số nguyên 1 được trả lại - Flask áp dụng các quy tắc cuối cùng và cố gắng để chuyển đổi nó thành một đối tượng phản ứng và thất bại. Bên trong, make_response() method được gọi đó, trong trường hợp của một số nguyên, sẽ gọi force_type() method của một lớp werkzeug.Response mà cuối cùng sẽ thất bại tạo một thể hiện của một lớp BaseResponse khi cố gắng để nhanh chóng một ứng dụng WSGI:

app_rv = app(environ, start_response) 

nơi app tại của bạn case là số nguyên 1.

+0

Ah, ngớ ngẩn tôi! Vì vậy, tất cả những gì tôi phải làm là "return" 1 "'. Cảm ơn! Sẽ chấp nhận điều này như câu trả lời của tôi ngay khi trang web cho phép tôi. – dotslash

+0

Và cảm ơn lời giải thích đầy đủ. Làm cho tôi thấy các khung công tác web theo một ánh sáng hoàn toàn khác. :-) – dotslash

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