2012-05-02 39 views
8

Kịch bản điển hình của việc lưu trữ tệp hình ảnh trong Django là gì? Cụ thể hơn, là hình ảnh được lưu trữ trực tiếp trong blob cơ sở dữ liệu (ví dụ: MongoDB GridFS), trên hệ thống tệp cục bộ hoặc Amazon S3? Đối với cả ba trường hợp là có các công cụ hoặc gói django có sẵn để đơn giản hóa cuộc sống của bạn với lưu trữ hình ảnh?Làm thế nào để lưu trữ các tập tin hình ảnh trong Django?

Tôi hiện đang lưu hình ảnh và phục vụ từ thư mục phương tiện truyền thông trong dự án Django trên máy chủ phát triển cục bộ. Có người nói với tôi đó là một thực tế xấu để phục vụ các tập tin tĩnh trên cùng một máy. Vì vậy, một kịch bản thế giới thực điển hình của việc lưu trữ và phục vụ hình ảnh tĩnh trong Django là gì?

Trả lời

8

Một điển hình, ví dụ thực tế sẽ được lưu trữ hình ảnh được tải lên trong thư mục con của thư mục media/ trang web của bạn :)

này có thể trở thành một vấn đề nếu bạn cần lưu trữ nhiều hình ảnh hơn máy chủ ứng dụng của bạn có ổ cứng không gian hoặc bạn cần nhiều hơn một máy chủ ứng dụng hoặc bạn muốn sử dụng CDN để giảm thời gian chờ của bạn hoặc… một trong hàng nghìn thứ khác.

Nhưng, trừ khi bạn có các yêu cầu cụ thể về mặt trước, cách duy nhất để biết (nếu có) trong số hàng ngàn thứ bạn cần phải lo lắng là khởi chạy trang web của mình và cách nhanh nhất để làm điều đó là lưu trữ hình ảnh trong thư mục con của media/.

Nếu bạn làm điều này bằng cách sử dụng FileField, và bạn đang cẩn thận trong mã của bạn không giả định, ví dụ, rằng hình ảnh là một tập tin trên đĩa cục bộ của bạn (ví dụ, bạn làm sử dụng phương pháp .url() của FileFile và bạn không sử dụng thuộc tính .path), nó sẽ được chuyển thẳng về phía trước để di chuyển những hình ảnh đó lên một phụ trợ thích hợp hơn khi (và nếu) thời gian đến.

4

Theo mặc định, Django saves all of your files (and images) in the MEDIA_ROOT. Tuy nhiên, bạn có thể viết một số custom file storage để lưu nó ở những nơi khác.

Chọn gì? Nó thực sự phụ thuộc.
Bạn dự định lưu trữ bao nhiêu tệp? Họ sẽ sử dụng bao nhiêu bộ nhớ? Băng thông bao nhiêu? Bạn có nghĩ rằng sẽ có những đỉnh cao của việc sử dụng rất cao?

Thông thường, hệ thống tệp cục bộ là tùy chọn nhanh nhất; nhưng nếu bạn thấy rằng những hình ảnh đó sẽ sử dụng quá nhiều băng thông của bạn, thì bạn có thể muốn giảm tải chúng, đặc biệt nếu mẫu sử dụng nhìn thấy các đỉnh cao. Ngược lại, nếu bạn cần mở rộng ra một số máy chủ, thì bạn có thể thấy nó có lợi khi di chuyển chúng trong cơ sở dữ liệu.

Dù sao, bạn chỉ nên quyết định sau khi nhận được một số dữ liệu, nếu có thể có dữ liệu thực. Chuyển sang một hệ thống lưu trữ khác là khá dễ dàng, vì vậy tôi sẽ bắt đầu với hệ thống tập tin cục bộ, và sau đó chuyển sang một cái gì đó fancier chỉ sau khi nhìn thấy vấn đề.

1

Nó thực sự phụ thuộc vào giải pháp bạn đang cố giải quyết. Có những trường hợp s3 có thể là một giải pháp tốt hơn nhiều so với lưu trữ tệp cục bộ. s3 cung cấp sự linh hoạt hơn về khả năng truy cập dữ liệu từ các ứng dụng web khác nhau và được tách riêng khỏi máy chủ bạn đang sử dụng. Tôi nghĩ rằng s3 là một con đường để đi nếu bạn có kế hoạch sử dụng rất nhiều hình ảnh. Nếu bạn nghĩ rằng có một số lượng hạn chế của hình ảnh mà bạn sẽ sử dụng, sau đó lưu trữ cục bộ trên máy chủ sẽ là một thực hiện tốt (tôi nghĩ).

Về công cụ mà bạn có thể sử dụng, tôi sẽ xem xét PIL.http://www.pythonware.com/products/pil/

3

Thực tiễn không tồi, mỗi giây. Tôi nghĩ bất cứ ai nói với bạn rằng đó là một chút bối rối. Django nói rằng bạn không bao giờ nên phân phát tài nguyên tĩnh với Django, tức là chúng phải được phục vụ trực tiếp bởi máy chủ web mà bạn đang sử dụng làm proxy ngược cho Django (Apache, nginx, v.v.), nhưng không gây tranh cãi về điều đó trên một máy chủ khác hoặc cùng một máy chủ.

Nếu bạn có một ứng dụng hoặc trang web đơn giản, sử dụng máy chủ hoàn toàn khác cho các tệp tĩnh có thể là quá mức cần thiết. Nó chỉ quan trọng trong trường hợp đồng thời cao (nghĩ rằng Twitter, Facebook, vv), nơi ứng dụng không thể đủ khả năng để máy chủ web lo lắng về bất cứ điều gì, nhưng đưa các yêu cầu tới chính ứng dụng đó. Bây giờ, một số máy chủ web cung cấp bộ nhớ "đám mây" để đi cùng với VPS của bạn (ví dụ Rackspace). Nếu bạn đang sử dụng một máy chủ như vậy, bằng mọi cách tận dụng lợi thế của những gì bạn có, nhưng nó không cần thiết cho hầu hết các phần.

Tuy nhiên, có có lợi trong việc phân phát tài nguyên tĩnh theo một tên miền phụ khác khác. Bạn có thể sử dụng cùng một máy chủ, nhưng sử dụng tên miền phụ (ví dụ: static.mysite.com) sẽ cho phép các trình duyệt thực hiện tải xuống song song hơn, trong một số trường hợp và ít nhất, ngăn cookie từ trang web chính bị gắn vào từng tĩnh yêu cầu.

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