2012-05-01 34 views
8

Tôi có ứng dụng facebook với bình với nginx và uwsgi. Khi nhận được POST từ facebook, nó luôn có lỗi:Lỗi: readv() không thành công (104: Thiết lập lại kết nối ngang hàng) khi đọc ngược dòng

readv() failed (104: Connection reset by peer) while reading upstream 

Nhưng khi tôi truy cập trực tiếp vào ứng dụng của tôi (bằng phương thức GET), nó chạy trơn tru. Những gì tôi đã thực hiện:

  1. Giới hạn @ app.route chỉ với phương thức POST - không hoạt động.
  2. Thêm giới hạn trong wsgi: uwsgi_buffer_size (trong trường hợp yêu cầu từ facebook là lớn) và uwsgi_harakiri (trong trường hợp uwsgi cung cấp thời gian chờ trước khi hoàn thành yêu cầu) - không hoạt động.

Tôi có cách giải quyết khác trong django nhưng không thể tìm ra cách thực hiện trong bình. Bất cứ ai có thể giúp đỡ xin vui lòng?

+0

câu trả lời hơi vô lý đối với tôi. Tôi phải xử lý tất cả dữ liệu bài đăng, ngay cả khi quy trình của tôi không làm gì cả. nếu "không có gì" không có trong request.form: pass. Làm việc của nó .. Btw, facebook mở ứng dụng với yêu cầu POST, vì vậy tôi nên thêm ứng dụng đó cho mọi tuyến đường. Phải có cách tốt hơn để làm điều đó .. – asofyan

+0

Nếu có dữ liệu trên ổ cắm, bạn phải đọc chúng (không có lựa chọn nào khác). Trên wiki bình, bạn có thể tìm thấy một phần mềm trung gian để bỏ qua vấn đề thường gặp này trên thiết lập proxy: http://flask.pocoo.org/snippets/47/ uWSGI có thể giúp bạn với tùy chọn --post-buffering, nhưng nó chỉ là một lối tắt, không có ma thuật trong đó. – roberto

+0

Cảm ơn đoạn mã @roberto – asofyan

Trả lời

2

Đây là lỗi của uwsgi. Bạn có thể nhận được nhiều hơn từ [uWSGI] Several bugs.

Giải pháp đơn giản là bạn phải đọc nội dung POST bằng wsgi.input, thậm chí thông qua POST body là null hoặc bạn không cần tham số POST.

+0

điều này không liên quan gì đến uWSGI (và chắc chắn đó không phải là lỗi). Đóng một socket mà không đọc dữ liệu trong nó, là một hành vi lập trình sai. uWSGI có thể giúp bạn (nếu bạn không muốn thay đổi mã của mình), hãy tự động lưu dữ liệu bài đăng qua tùy chọn --post-buffering. – roberto

+0

@roberto Cảm ơn bạn. Khi thêm tùy chọn đệm sau trong cài đặt uwsgi, nó hoạt động. Nhưng trong một số trường hợp, ví dụ, yêu cầu đăng bài không có tham số, nó không cần phải đọc bài đăng cơ thể từ wsgi.input. Vì vậy, tôi không nghĩ rằng đó là sai lầm của các lập trình viên. –

0

Vấn đề là "thượng nguồn" (quá trình thực tế mà nginx là proxing) đang đóng kết nối.

Trong trường hợp của tôi, Django là máy chủ web của tôi và tôi cần đặt DATA_UPLOAD_MAX_NUMBER_FIELDS trở nên lớn hơn vì có quá nhiều trường trong yêu cầu POST.

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