Sự khác biệt giữa STATICFILES_DIR, STATIC_ROOT và MEDIA_ROOT


80

Sự khác biệt của ba url tĩnh này là gì?

Tôi không chắc mình có đúng hay không, tôi đang sử dụng MEDIA_ROOTđể lưu trữ ảnh đã tải lên của mình (qua models.ImageField())

Tuy nhiên, tôi đã tạo một tập lệnh JS cho quản trị viên của mình và trong admin.py. Tôi đã xác định phương tiện như sau:

....
class Media:
      js = ('/admin/custom.js', )

và của tôi settings.py:

 ....
 STATIC_ROOT = "/home/user/project/django1/top/listing/static"

và tôi thêm custom.jsvào STATIC_ROOT/admin/custom.js, nhưng nó không phải đang làm việc. Ném 404 không tìm thấy lỗi.

Và sau đó tôi thay đổi STATIC_ROOTthành STATICFILES_DIRS, và nó hoạt động !!

....
STATICFILES_DIRS = "/home/user/project/django1/top/listing/static"

Vì vậy, tôi không hiểu chuyện gì đang xảy ra ở đây. Trong thực tế, tôi chỉ không hiểu sự khác biệt giữa STATIC_ROOTSTATICFILES_DIRS.

Hiện tại mình đang test Django trong máy của mình qua virtualenv, chưa triển khai được, có phải lý do STATIC_ROOTkhông hoạt động được không ??


1
Xem thêm một hình ảnh tôi đã thực hiện về cách các tập tin tĩnh làm việc trong sản xuất: djangodeployment.com/2016/11/21/...
Antonis Christofides

Câu trả lời:


119

Bạn có thể tìm thấy các cài đặt này trong tài liệu Django . Dưới đây là định nghĩa và trích dẫn của riêng tôi từ tài liệu:

  • MEDIA_ROOTlà thư mục chứa các tệp được tải lên bằng cách sử dụng FileField.

    Đường dẫn tuyệt đối của hệ thống tệp đến thư mục chứa các tệp do người dùng tải lên .

  • STATIC_ROOT là thư mục nơi các tệp tĩnh sẽ được lưu trữ sau khi sử dụng manage.py collectstatic

    Đường dẫn tuyệt đối đến thư mục nơi collectstaticsẽ thu thập các tệp tĩnh để triển khai.

    Nếu staticfilesứng dụng đóng góp được bật (mặc định), collectstaticlệnh quản lý sẽ thu thập các tệp tĩnh vào thư mục này. Xem cách quản lý tệp tĩnh để biết thêm chi tiết về cách sử dụng.

  • STATICFILES_DIRSlà danh sách các thư mục nơi Django sẽ tìm kiếm các tệp tĩnh bổ sung ngoài staticthư mục của từng ứng dụng đã cài đặt.

    Cài đặt này xác định các vị trí bổ sung mà ứng dụng staticfiles sẽ đi qua nếu FileSystemFindercông cụ tìm được bật, ví dụ: nếu bạn sử dụng lệnh collectstatichoặc findstaticquản lý hoặc sử dụng chế độ xem phục vụ tệp tĩnh.

Trong cài đặt của mình, bạn nên có:

MEDIA_ROOT = os.path.join(BASE_DIR, "media/")
STATIC_ROOT = os.path.join(BASE_DIR, "static/")

# Make a tuple of strings instead of a string
STATICFILES_DIRS = ("/home/user/project/django1/top/listing/static", )

...Ở đâu:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

như được định nghĩa trong Django mặc định settings.pybây giờ.


3
Đây là một cách dễ dàng câu trả lời rõ ràng nhất IMO, mặc dù tôi có cảm giác như câu hỏi này là một dupe định
Ian Clark

4
@MaximeLorant Thành thật mà nói, giải thích của bạn tốt hơn tài liệu Django.
Eje

2
@MaximeLorant câu trả lời được xây dựng đẹp mắt. Như Jee đã đề cập, rõ ràng hơn nhiều so với bản thân các tài liệu.
Neil Hickman

125

Phát triển

STATIC_ROOT là vô dụng trong quá trình phát triển, nó chỉ được yêu cầu để triển khai.

Trong khi phát triển, STATIC_ROOTkhông làm gì cả. Bạn thậm chí không cần thiết lập nó. Django tìm kiếm các tệp tĩnh bên trong thư mục của mỗi ứng dụng ( myProject/appName/static) và phân phát chúng tự động.

Đây là điều kỳ diệu được thực hiện bởi manage.py runserverkhi nào DEBUG=True.

Triển khai

Khi dự án của bạn hoạt động, mọi thứ sẽ khác. Nhiều khả năng bạn sẽ phân phát nội dung động bằng Django và các tệp tĩnh sẽ được cung cấp bởi Nginx. Tại sao? Bởi vì Nginx cực kỳ hiệu quả và sẽ giảm khối lượng công việc khỏi Django.

Đây là nơi STATIC_ROOTtrở nên hữu ích, vì Nginx không biết gì về dự án django của bạn và không biết tìm các tệp tĩnh ở đâu.

Vì vậy, bạn đặt STATIC_ROOT = '/some/folder/'và yêu cầu Nginx tìm kiếm các tệp tĩnh trong /some/folder/. Sau đó, bạn chạy manage.py collectstaticvà Django sẽ sao chép các tệp tĩnh từ tất cả các ứng dụng bạn có /some/folder/.

Thư mục bổ sung cho các tệp tĩnh

STATICFILES_DIRSđược sử dụng để bao gồm các thư mục bổ sungcollectstatic để tìm kiếm. Ví dụ: theo mặc định, Django không nhận ra /myProject/static/. Vì vậy, bạn có thể bao gồm nó cho mình.

Thí dụ

STATIC_URL = '/static/'

if not DEBUG: 
    STATIC_ROOT = '/home/django/www-data/site.com/static/'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static/'),
]

19
Giải thích tốt nhất cho STATIC_ROOT, v.v. Rõ ràng và ngắn gọn. Đây là những gì nên có trong tài liệu django.
Homunculus Reticulli

1
@Max Malysh đó là cấp độ câu trả lời mà chúng ta nên có. Hiểu rồi! A +
adhg

1
Nhiều sáng tỏ. Cảm ơn!
MadPhysicist

23

Sự khác biệt giữa STATICFILES_DIRSSTATIC_ROOT

STATICFILES_DIRSthể chứa các thư mục khác (không nhất thiết là thư mục ứng dụng) với các tệp tĩnh và các tệp tĩnh này sẽ được thu thập vào STATIC_ROOT của bạn khi bạn chạy collectstatic. Sau đó, các tệp tĩnh này sẽ được máy chủ web của bạn cung cấp và chúng sẽ được phân phát từ STATIC_ROOT của bạn.

Nếu bạn hiện có các tệp trong STATIC_ROOT của mình mà bạn muốn cung cấp thì bạn cần phải chuyển các tệp này sang một thư mục khác và đặt thư mục khác đó vào STATICFILES_DIRS. Thư mục của bạn STATIC_ROOTphải trống và tất cả các tệp tĩnh phải được thu thập vào thư mục đó.

MEDIA_ROOTcác tệp phương tiện, tất cả các tệp đã tải lên sẽ đi đâu. Ví dụ: Hình ảnh, Tệp


5
Cảm ơn vì câu trả lời. Ước gì tôi có thể chấp nhận nhiều hơn 1 câu trả lời cho câu hỏi. Câu trả lời của bạn cũng rất hữu ích cho tôi.
dev-jim
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.