Điểm thu hút của Django là gì?


87

Đây có lẽ là một câu hỏi ngu ngốc, nhưng nó không gây ấn tượng trong đầu tôi.

Trong Django, quy ước là đặt tất cả các tệp tĩnh (tức là css, js) dành riêng cho ứng dụng của bạn vào một thư mục được gọi là tĩnh . Vì vậy, cấu trúc sẽ giống như sau:

mysite/
    manage.py
    mysite/ --> (settings.py, etc)
    myapp/ --> (models.py, views.py, etc)
        static/

Trong mysite/settings.pytôi có:

STATIC_ROOT = 'staticfiles'

Vì vậy, khi tôi chạy lệnh:

python manage.py collectstatic   

Nó tạo một thư mục được gọi staticfilesở cấp cơ sở (thư mục giống như vậy myapp/)

Mục đích của điều này là gì? Nó không chỉ là tạo một bản sao của tất cả các tệp tĩnh của tôi?

Câu trả lời:


70

Thu thập các tệp tĩnh từ nhiều ứng dụng vào một đường dẫn duy nhất

Vâng, một Django đơn dự án có thể sử dụng một số ứng dụng , như vậy trong khi đó bạn chỉ có một myapp, nó có thể thực sự được myapp1, myapp2, vv

Bằng cách sao chép chúng từ bên trong các ứng dụng riêng lẻ vào một thư mục duy nhất, bạn có thể trỏ máy chủ web giao diện người dùng của mình (ví dụ: nginx) đến thư mục duy nhất đó STATIC_ROOTvà cung cấp các tệp tĩnh từ một vị trí duy nhất, thay vì định cấu hình máy chủ web của bạn để phân phát tệp tĩnh từ nhiều đường dẫn .

URL liên tục với ManifestStaticFilesStorage

Lưu ý về băm MD5 được thêm vào tên tệp để tạo phiên bản: Nó không phải là một phần của hành vi mặc định collectstatic, vì settings.STATICFILES_STORAGEmặc định là StaticFilesStorage(không làm điều đó)

Hàm băm MD5 sẽ khởi động, ví dụ như nếu bạn đặt nó để sử dụng ManifestStaticFilesStorage, quảng cáo nào sẽ hoạt động đó.

Mục đích của việc lưu trữ này là để tiếp tục cung cấp các tệp cũ trong trường hợp một số trang vẫn tham chiếu đến các tệp đó, ví dụ: do bạn hoặc máy chủ proxy của bên thứ ba lưu trong bộ nhớ cache. Ngoài ra, nó rất hữu ích nếu bạn muốn áp dụng tiêu đề Expires trong tương lai xa cho các tệp được triển khai để tăng tốc thời gian tải cho các lần truy cập trang tiếp theo.


3
bạn muốn nói rằng sẽ dễ dàng tìm thấy máy chủ web để phục vụ nội dung tĩnh
babygame0ver

44

Các tệp tĩnh Django có thể ở nhiều nơi. Một tệp được phân phát /static/img/icon.pngcó thể đến từ nhiều nơi . Theo mặc định:

  • FileSystemFindersẽ tìm kiếm img/icon.pngtrong mỗi STATICFILES_DIRS,
  • AppDirectoriesFindersẽ tìm kiếm img/icon.pngtrong staticthư mục con trong mỗi của bạn INSTALLED_APPS. Điều này cho phép các thư viện như Django Admin thêm các tệp tĩnh của riêng họ vào ứng dụng của bạn.

Bây giờ: điều này chỉ hoạt động nếu bạn chạy manage.py runservervới DEBUG = 1. Khi bạn phát hành trực tiếp, quy trình Django sẽ không còn phân phát nội dung tĩnh nữa. Sẽ không hiệu quả nếu sử dụng Django để phục vụ những thứ này, có nhiều công cụ chuyên biệt hơn dành riêng cho việc đó.

Thay vào đó, bạn nên làm điều gì đó như sau:

  • tìm tất cả các tệp tĩnh từ mọi ứng dụng
  • xây dựng một thư mục duy nhất chứa tất cả chúng
  • tải chúng lên ở đâu đó ( staticthư mục ở đâu đó trên máy chủ web của bạn hoặc nơi lưu trữ tệp của bên thứ ba)
  • định cấu hình máy chủ web của bạn (chẳng hạn như nginx) để phục vụ /static/*trực tiếp từ thư mục đó và chuyển hướng bất kỳ yêu cầu nào khác đến Django.

collectstatic là một tập lệnh tạo sẵn chuẩn bị thư mục này cho bạn để bạn có thể kết nối trực tiếp nó với tập lệnh triển khai của mình.


25

Trong cài đặt sản xuất, bạn muốn có các URL liên tục. URL không thay đổi trừ khi nội dung tệp thay đổi.

Điều này là để tránh việc khách hàng có phiên bản tệp CSS hoặc JS sai trên máy tính của họ khi mở trang web từ Django. Django staticfiles phát hiện các thay đổi của tệp và cập nhật URL cho phù hợp, để nếu tệp CSS hoặc JS thay đổi, trình duyệt web sẽ tải xuống phiên bản mới.

Điều này thường đạt được bằng cách thêm băm MD5 vào tên tệp trong quá trình collectstaticchạy.

Chỉnh sửa: Cũng xem câu trả lời liên quan cho nhiều ứng dụng.


1
Tốt! didnot biết điều đó
doniyor

"thường đạt được bằng cách thêm MD5 băm" ý bạn là ManifestStaticFilesStorage ? Thật tuyệt, tôi chưa thấy điều đó
Kos

3
Tôi nghĩ rằng theo mặc định không có băm MD5 nào diễn ra, vì settings.STATICFILES_STORAGEmặc định là StaticFilesStorage, vì vậy MD5 sẽ chỉ bắt đầu sau khi bạn ví dụ: đặt nó thành ManifestStaticFilesStorage, tôi có chính xác không?
bakkal

@MikkoOhtamaa Nhưng sau đó làm cách nào để ứng dụng giao diện biết được nó sẽ liên kết với tên tệp nào vì tên tệp sau luôn thay đổi?
lapin

@lapin Câu hỏi hay! Đương nhiên cần phải tồn tại 1) ánh xạ tới các phiên bản mới nhất và 2) cách truyền đạt điều này. Thông thường nó được lưu trữ trong một tệp ở đâu đó và sau đó khi bạn hỏi "URL đầy đủ nào cho phiên bản mới nhất của X", nó sẽ cho bạn kết quả.
Mikko Ohtamaa

9

Nó hữu ích khi có nhiều ứng dụng django trong trang web.

collectstatic sau đó sẽ thu thập các tệp tĩnh từ tất cả các ứng dụng ở một nơi - để nó có thể được phân phát trong môi trường sản xuất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.