2010-01-21 37 views
8

Tôi muốn tạo động các hình thu nhỏ dựa trên các thông số trong URL. Ví dụ: http://mysite.com/images/1234/120x45.jpg sẽ tạo hình thu nhỏ 120x45 cho id hình ảnh 1234.Tự động tạo hình thu nhỏ hình ảnh (sử dụng django)

Các giải pháp rõ ràng cho điều này là để có một cái nhìn django mà làm như sau:

  1. Hãy tìm một phiên bản cache trước đó của hình ảnh ở kích thước này.
  2. Tạo hình thu nhỏ nếu nó không được lưu trong bộ nhớ cache (một số logic để khóa sao cho chỉ có 1 quy trình tạo hình thu nhỏ và các quy trình khác chờ).
  3. Nối kết quả qua django.

Điều đó nên "hoạt động", nhưng tôi lo ngại về hiệu suất. Tôi không thích ý tưởng sử dụng django để phục vụ nội dung tĩnh. Một số cách khác để thực hiện vấn đề này là gì?

+0

Nếu bạn đang tự động tạo ra hình thu nhỏ, sau đó nó không thực sự tĩnh, phải không? –

+0

Tôi nghĩ về nó như một hình thu nhỏ tĩnh được tải xuống. Khi nó được tạo ra, tôi muốn cùng một hiệu suất như thể nó là tĩnh. – Gattster

Trả lời

8

Bạn không phải sử dụng Django để phục vụ nội dung tĩnh trực tiếp. Chỉ cần yêu cầu 404 tuyến máy chủ cho thư mục hình ảnh của bạn đến chế độ xem Django, nơi chia tách tên tệp và tạo hình thu nhỏ thích hợp, trước khi chuyển hướng trở lại URL ban đầu (hy vọng sẽ không còn là 404).

Đối với đề xuất django-imagekit của câu trả lời khác, tôi không chắc nó làm bất cứ điều gì để cho phép bạn động tạo hình ảnh dựa trên URL, nhưng tôi chắc chắn khuyên bạn nên sử dụng nó cho tất cả các tính năng của nó.

Edit:

Đối với các cấu trúc URL thực tế, tôi cảm thấy một điển hình hơn /images/filename-120x45.jpg sẽ cho phép bạn dễ dàng hơn lọc ra 404 yêu cầu mà không có gì để làm với thế hệ thumbnail động. Ví dụ: giả sử có rất nhiều lỗi 404 cho /images/original_size_image.jpg. Bạn sẽ không muốn những người được chuyển đến Django, và bạn chỉ có thể phù hợp với tên tập tin của định dạng đó với regex. [chỉnh sửa cuối]

Bạn phải cẩn thận khi để bất kỳ ai biết tính năng này gửi spam ứng dụng Django của bạn. Họ có khả năng có thể giết nó với vô số kích thước hình ảnh và sự kết hợp tên tập tin trong tầm tay của họ. Bạn sẽ cần phải tìm cách đặt giới hạn trên cho các yêu cầu này, chẳng hạn như chuyển hướng quay lại 404 nếu thứ nguyên lớn hơn kích thước gốc hoặc thậm chí tìm ra cách yêu cầu nhiều thứ nguyên cho cùng một kích thước của cùng một hình ảnh. Có lẽ đây là những gì bạn đã nhận được khi đề cập đến "khóa" mặc dù.

Ngoài ra, tôi thấy bạn đã gắn thẻ Apache nhưng tôi thực sự muốn khuyên bạn nên phân phối nội dung tĩnh thông qua một cái gì đó như Nginx. Bạn có thể có thể phủ nhận các chi phí bổ sung của các yêu cầu hình ảnh động nếu bạn sử dụng một máy chủ tập tin tĩnh mà không phải là hoàn toàn crap lúc phục vụ các tập tin tĩnh.

+0

Câu trả lời hay. Một giải pháp cho vấn đề spam là phải có danh sách được xác định trước về kích thước hình ảnh/hình thu nhỏ được phép. Ngoài ra, tôi đồng ý về nginx. Tôi đang sử dụng nginx để phục vụ nội dung tĩnh hiện tại và sẽ thêm thẻ nginx vào câu hỏi này. – Gattster

+0

Ah, vâng ... nhưng tôi không chắc chắn về cách "động" một danh sách được xác định trước các kích thước cho phép sẽ là cho bạn, vì vậy tôi đã không đề cập đến nó. Tôi cũng không chắc chắn về định dạng hình ảnh của bạn và nếu chúng là tỷ lệ nhất quán hoặc chuẩn, hoặc nếu bạn định cắt xén ngón tay cái nếu nó không vừa với kích cỡ được xác định trước, v.v. Ngoài ra, tôi sẽ chỉnh sửa câu trả lời của tôi trong giây lát để thêm thông tin về định dạng URL mà bạn thảo luận. – jonwd7

+0

Tôi đang sử dụng chai cho điều này nhưng nó làm việc bằng cách sử dụng cùng một nguyên tắc. Đó là loại mát mẻ mà nó hoạt động theo cách này. –

4

Bạn cũng có thể thử sorl, nó đang được sử dụng bởi Satchmo.

2

Bạn có thể xem nhanh the sorl-thumbnail documentation.Tôi sử dụng nó trong hầu hết các dự án của tôi cùng với việc phục vụ nội dung tĩnh với Nginx từ thư mục /media/ :)

2

Tôi đã tra cứu những câu trả lời này và mặc dù chúng hoạt động quá phức tạp đối với tôi. Nếu bạn chỉ muốn một cách nhanh chóng và dơ bẩn để có được hình thu nhỏ, chỉ cần sử dụng thư viện PIL có thể là một cuộc gọi tốt, đây là mã của tôi:

file, ext = os.path.splitext('image.jpg') 
im = Image.open('/full/path/to/image.jpg') 
im.thumbnail(size, Image.ANTIALIAS) 
thumb_path = os.path.join('/full/path/to/thumb/dir/', file + ".thumb" + ".jpeg") 
im.save(thumb_path) 

Tải thư viện PIL here

Chúc mừng, hy vọng này giúp ai đó.

0

Check-out trang thảo luận này về đóng góp thumbnail cho Django:

https://code.djangoproject.com/wiki/ThumbNails

+0

Câu trả lời chỉ chứa các liên kết được coi là thực hành không tốt (http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers). Vui lòng tóm tắt nội dung ở đây (không sao chép/dán) để câu trả lời có thể tự đứng vững. Nếu bạn không chạy nguy cơ câu trả lời của bạn bị xóa, đặc biệt nếu liên kết đã từng chết. –

4

Xem ứng dụng này để tạo ra ngón tay cái.

Được phát triển bằng Python, sử dụng máy chủ tornadoweb.

https://github.com/globocom/thumbor

pip install thumbor 

lớn Application

+0

Thumbor thực sự làm mọi thứ mà OP muốn. –

0

tôi đã có vấn đề chính xác giống nhau: trong một trang web lưu lượng truy cập cao, tạo ra hàng tá các hình thu nhỏ ở thời gian đáp ứng là không khả thi, như là tạo hình thu nhỏ cho tất cả quá khứ nội dung theo lô, vì vậy tôi đã tạo một ứng dụng cho điều đó. Hãy khám phá: https://github.com/hcarvalhoalves/django-rest-thumbnails

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