Bạn đang chuyển giá trị được trả về bởi FileField
image
trực tiếp vào phản hồi như thể nó là một chuỗi hoặc có thể lặp lại. Kiểm tra mã nguồn
đối với đường dẫn ngoại lệ đã cho, chúng tôi thấy rằng đối tượng được trường trả về có dòng vi phạm trong __iter__
của nó phương thức - lớp wrapper đang tìm kiếm các trình kết thúc dòng. Chắc chắn là hợp lý khi tệp hình ảnh thô có thể chứa các byte không thể được chuyển đổi thành một thứ gì đó có thể được so sánh với các ký tự kết thúc dòng.
HttpResponse
chỉ cần một cái gì đó nó có thể coi như một chuỗi - nếu bạn cung cấp cho nó một trình vòng lặp, nó sẽ đọc tất cả cùng một lúc và tạo một chuỗi, vì vậy không có tiết kiệm bộ nhớ nào khả dụng:
https://docs.djangoproject.com/en/ dev / ref / request-response / # pass-iterator
Vì vậy, bạn cần một thứ gì đó sẽ kéo nội dung của đối tượng trình bao bọc tệp hình ảnh của bạn mà không cần thông qua giao diện lặp. đọc phương thức thực hiện điều đó, kéo toàn bộ nội dung của tệp vào nếu bạn không cung cấp cho nó một số byte đối số. Vì vậy, điều đầu tiên tôi muốn thử là:
return HttpResponse(get_image.read(), mimetype="image/png")
Điều này chưa được kiểm tra, vì vậy tôi có thể đã bỏ qua điều gì đó.
Bạn cũng có thể thử lập hồ sơ trường hợp đơn giản hơn là để máy chủ web lưu trữ của bạn xử lý hình ảnh và chỉ phân phát chuyển hướng đến URL
được trả về từ FileField
. Điều đó sẽ liên quan đến một vòng quay HTTP bổ sung để cho trình duyệt biết nơi cần tìm, vì vậy tôi không nghĩ rằng có một quy tắc chung nào cho cách tiếp cận nào sẽ nhanh hơn.