2010-05-28 28 views
8

Tôi đã có một cái nhìn như sau:Truyền HTTP response, đỏ bừng chuyển sang trình duyệt

from django.views.decorators.http import condition 

def stream(): 
    for i in range(0, 40): 
     yield " " * 1024 
     yield "%d" % i 
     time.sleep(1) 

@condition(etag_func=None): 
def view(request): 
    return HttpResponse(stream(), mimetype='text/html') 

Tuy nhiên, nó chắc chắn có vẻ không được streaming ở tất cả. Tất cả các dữ liệu được bán cùng một lúc, cuối cùng, sau khoảng 40 giây. Làm thế nào tôi có thể làm cho nó tuôn ra một cách chính xác?

+1

liên quan: http://stackoverflow.com/questions/2922874/how-to-stream-an-httpresponse-with-django – miku

+0

Vâng, đó là nơi tôi có ý tưởng mã để thử, tuy nhiên, nó không có vẻ để làm việc cho tôi. Không chắc tôi đang làm gì sai ở đây. – synic

+0

Những gì bạn đang làm là hoàn toàn không tiêu chuẩn và chỉ có một phép lạ xảy ra vì các chi tiết về cách một số trình duyệt thực hiện http. Tôi muốn nói, hãy thử nó với một loạt các trình duyệt và số lượng khác nhau của khoảng trắng .. Cuối cùng, bạn có thể sẽ tìm thấy một lỗ hổng bảo mật khai thác từ xa. –

Trả lời

3

Để thực hiện công việc phát trực tuyến http, phần mềm trung gian, container WSGI và máy chủ web (cũng như proxy ngược/tải cân bằng nếu bạn sử dụng triển khai nginx + apache2 syle) tất cả đều phải hỗ trợ nó. Vô hiệu hóa phần mềm trung gian và loại bỏ một số lớp cho đến khi nó hoạt động (bất cứ điều gì làm bộ nhớ đệm hoặc đặt etags là ra), sau đó thêm chúng trở lại. Tôi không biết những gì bạn có stack, nhưng IIRC apache2 + mod_python là OK với streaming, mặc dù nó không phải là cách đề nghị để phục vụ Django.

+1

Cảm ơn! Điều này đã giúp tôi. Trong trường hợp nginx, tôi cần 'proxy_buffering off;'. – d33tah

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