2014-04-03 17 views
7

Tôi hiện có trong dự án urls.py của tôi, dòng cuối cùng là điều quan trọng.Django - Đang phục vụ các tệp MEDIA/tải lên trong sản xuất

urlpatterns = patterns('', 
    url(r'^', include('polls.urls', namespace="polls")), 
    url(r'^admin/', include(admin.site.urls)), 
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 

Tôi đã được thông báo và tôi đã đọc rằng điều này không phù hợp với môi trường sản xuất. Tại sao điều này là trường hợp?

Trả lời

6

Django được xây dựng thành một "máy chủ ứng dụng", không phải là "máy chủ web".

Nói cách khác, phân phối tệp tĩnh từ Django sẽ có hiệu suất kém hơn so với sử dụng Apache hoặc Nginx. Các máy chủ nội dung tĩnh này (1) được viết bằng C và (2) được tối ưu hóa cho hiệu suất.

Ngược lại, Django là (1) được viết bằng Python thuần túy và (2) được tối ưu hóa để phát triển một ứng dụng.

Xem documentation.


Điều đó có thể hoàn toàn ổn. Tôi đã sử dụng Django để phục vụ nội dung tĩnh trong sản xuất, khi tôi biết tải sẽ không cao và tôi đã không được phục vụ các tập tin lớn. Nó phụ thuộc vào loại môi trường "sản xuất" thực sự là.


FYI, A common thiết lập sản xuất sẽ sử dụng Nignx, Django, Gunicorn và Supervisor. Nginx máy chủ nội dung tĩnh từ đĩa và proxy ngược phần còn lại của nó để Gunicorn, chạy nhiều trường hợp Django. Giám sát giám sát Gunicorn và đảm bảo nó vẫn hoạt động. Tất cả phụ thuộc vào mức độ ứng dụng web bạn cần.

1

Không nên phân phát tệp tĩnh từ chính máy chủ django. Cách được đề nghị là để phục vụ chúng trong một máy chủ riêng biệt. kiểm tra static files deployment, ở đó bạn sẽ tìm thấy tất cả những gì bạn cần.

+0

Tôi đang sử dụng webfaction và apache đang phục vụ các tệp STATIC của tôi nhưng tôi không chắc chắn cách thức MEDIA của tôi đang được phân phát. Thư mục media hiện đang nằm trong thư mục dự án của tôi trong khi 'static_files' của tôi nằm ngoài nó đang được apache phục vụ. Tôi có nên đặt thư mục phương tiện của mình trong static_files và tạo các kết nối thích hợp không? Tôi chủ yếu là tò mò nếu tôi vẫn cần '+ tĩnh (...) trong url của tôi. Câu trả lời CÓ/KHÔNG sẽ đủ nếu bạn có thời gian :) – AllTheTime

+1

Xin chào, tôi cũng đang sử dụng webfaction. Tôi có thư mục phương tiện truyền thông cũng trong một ứng dụng webfaction riêng biệt (tôi đoán bạn có một cho tĩnh.). Vì vậy, cuối cùng, tôi có 3 ứng dụng khác nhau cho mỗi trang web, một ứng dụng để phân phát tĩnh, một ứng dụng khác cho truyền thông và một cho chính Django. Bạn không cần chỉ định dòng tĩnh trong urls.py. Bạn chỉ cần đặt {MEDIA, STATIC} _ROOT và {MEDIA, STATIC} _URL (cùng với STATICFILES_DIRS nếu cần) để trỏ chúng vào thư mục đích chính xác và url được định cấu hình (những cái bạn đã chỉ định khi gán ứng dụng cho trang web của mình). – argaen

+1

Btw, không đặt thư mục phương tiện truyền thông bên trong static_files, chúng là những thứ khác nhau để giữ cho riêng biệt để bảo trì tốt hơn và cấu trúc của dự án của bạn. – argaen

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