Sự khác biệt giữa STATIC_URL tĩnh và STATIC_ROOT trên Django


126

Tôi bối rối static rootvà muốn làm rõ mọi thứ.

Để phục vụ các tệp tĩnh trong Django, cần có các mục sau settings.pyurls.py:

import os
PROJECT_DIR=os.path.dirname(__file__)

1. Đường dẫn tuyệt đối đến thư mục chứa tập tin tĩnh

STATIC_ROOT= os.path.join(PROJECT_DIR,'static_media/')

2. Tiền tố URL cho các tệp tĩnh

STATIC_URL = '/static/'

3. Vị trí bổ sung cho các tệp tĩnh

STATICFILES_DIRS = ( os.path.join(PROJECT_DIR,'static/'),)

... và trong urls.pycác dòng sau:

from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += patterns('', (
    r'^static/(?P<path>.*)$',
    'django.views.static.serve',
    {'document_root': settings.STATIC_ROOT}
))

4. Chúng tôi cũng sử dụng python manage.py collectstatic

Câu hỏi:

  1. Bất cứ ai có thể vui lòng giải thích quy trình làm việc cho tôi: làm thế nào mọi thứ lý tưởng nên được thực hiện. Đến bây giờ, tôi sao chép / dán đoạn mã trên vào các vị trí được chỉ định của chúng và tiếp tục tạo các tệp mới trong thư mục tĩnh và nó hoạt động. Trong tôi settings.STATIC_ROOT, tuy nhiên, tôi đã chỉ đến một thư mục khác.

  2. Sẽ thật tuyệt nếu ai đó có thể giải thích quy trình làm việc của từng cài đặt: cách các tệp được thu thập và quản lý và điều gì sẽ là một cách thực hành tốt để làm theo.

Cảm ơn.


Bạn có thể làm rõ ý của bạn bằng cách 'giải thích quy trình công việc' không? Ngoài ra, các mẫu url của bạn phải có điều kiện nếu bạn đang phát triển trong phần 3. bạn có thể làm điều này bằng cách thêm if settings.DEBUG:django không tốt trong việc phục vụ phương tiện tĩnh, điều này nên được để lại cho một máy chủ web thực sự.
dm03514

Hi @ user993563 tôi thậm chí không thể tìm thấy giải pháp trong một số diễn đàn những gì tôi muốn. nhưng câu hỏi của bạn giải thích rõ ràng là nhờ người đàn ông ... công việc tuyệt vời ...
Mohideen bin Mohammed

Giải thích tốt, Cảm ơn
Ajay Kumar

Câu trả lời:


88

STATIC_ROOT

Đường dẫn tuyệt đối đến thư mục nơi ./manage.py collectstaticsẽ thu thập các tệp tĩnh để triển khai. Thí dụ:STATIC_ROOT="/var/www/example.com/static/"

bây giờ lệnh ./manage.py collectstaticsẽ sao chép tất cả các tệp tĩnh (tức là trong thư mục tĩnh trong ứng dụng của bạn, tệp tĩnh trong tất cả các đường dẫn) vào thư mục /var/www/example.com/static/. bây giờ bạn chỉ cần phục vụ thư mục này trên apache hoặc nginx..vv.

STATIC_URL

Trong URLđó các tệp tĩnh trong STATIC_ROOTthư mục được phục vụ (bởi Apache hoặc nginx..etc). Ví dụ: /static/hoặchttp://static.example.com/

Nếu bạn đã đặt STATIC_URL = 'http://static.example.com/', thì bạn phải phân phát STATIC_ROOTthư mục (tức là "/var/www/example.com/static/") bằng apache hoặc nginx tại url 'http://static.example.com/'(để bạn có thể tham chiếu tệp tĩnh '/var/www/example.com/static/jquery.js'với 'http://static.example.com/jquery.js')

Bây giờ trong mẫu django của bạn, bạn có thể tham khảo nó bằng cách:

{% load static %}
<script src="{% static "jquery.js" %}"></script>

Nó sẽ kết xuất:

<script src="http://static.example.com/jquery.js"></script>

1
Sự khác biệt giữa ví dụ của bạn và điều này: href = "{% tĩnh" jquery.js "%}"
Người dùng

8
@macdonjo cả {{ STATIC_URL }}jquery.js{% static "jquery.js" %}giống nhau. tức là cả hai sẽ trở về /static/jquery.js. Các phiên bản django mới hơn khuyên bạn nên sử dụng {% static "jquery.js" %}, nhưng bạn cần tải templatetag, tức là {% load staticfiles %}. trong phiên bản django cũ hơn khuyến nghị{{STATIC_URL}}
suhailvs

Tôi hiểu rồi. Tôi đã cố gắng tìm một lỗi khiến hầu hết các mẫu của tôi tải biểu định kiểu của tôi ngoại trừ một trang. Tôi đã thay đổi nó thành staticphương thức thay vì STATIC_URLphương thức và lỗi đã biến mất. Cuộc gọi tốt về các đề xuất dựa trên các phiên bản.
Người dùng

36

STATICFILES_DIRS: Bạn có thể giữ các tệp tĩnh cho dự án của mình tại đây, ví dụ: các tệp được sử dụng bởi các mẫu của bạn.

STATIC_ROOT: để trống, khi bạn thực hiện manage.py collectstatic, nó sẽ tìm kiếm tất cả các tệp tĩnh trên hệ thống của bạn và di chuyển chúng vào đây. Máy chủ tệp tĩnh của bạn được cho là được ánh xạ tới thư mục này bất cứ nơi nào nó được đặt. Kiểm tra nó sau khi chạy collstatic và bạn sẽ thấy cấu trúc thư mục django đã được xây dựng.

--------Biên tập----------------

Như @DarkCygnus đã chỉ ra, STATIC_ROOT nên trỏ đến một thư mục trên hệ thống tệp của bạn, thư mục sẽ trống vì nó sẽ được Django điền vào.

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

hoặc là

STATIC_ROOT = '/opt/web/project/static_files'

-------- Kết thúc chỉnh sửa -----------------

STATIC_URL: '/ static /' thường ổn, nó chỉ là tiền tố cho các tệp tĩnh.


2
Tại đây, liên kết đến quản lý tệp tĩnh trong 1.3 docs.djangoproject.com/en/1.3/howto/static-files
keni

2
STATICFILES_DIRSsẽ phục vụ như các thư mục bổ sung cho các tệp tĩnh. Nếu bạn đặt tất cả css / js / hình ảnh của mình vào thư mục APP_NAME / static / APP_NAME, thì không cần chỉ định STATICFILES_DIRS.
laike9m

Cảm ơn câu trả lời, về việc bỏ trống STATIC_ROOT, tôi thực sự phải chỉ định nó trong settings.py(bằng cách thực hiện STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')) trước khi chạy lệnh collstatic .
DarkCygnus

Hmm, tôi có thể thấy điều này có thể dễ gây hiểu lầm như thế nào. Ý tôi là bằng cách để trống, nó thường bắt đầu trống, không có tệp nào trong đó. Tôi sẽ cập nhật câu trả lời để loại bỏ sự nhầm lẫn.
keni

2

Tất cả các câu trả lời ở trên là hữu ích nhưng không ai giải quyết được vấn đề của tôi. Trong tệp sản xuất của tôi, STATIC_URL của tôi là https://<URL>/staticvà tôi đã sử dụng cùng STATIC_URL trong tệp dev settings.txt của mình.

Điều này gây ra lỗi thất bại trong django / conf / urls / static.py.

Thử nghiệm elif not settings.DEBUG or '://' in prefix: chọn '//' trong URL và không thêm mẫu URL tĩnh, khiến không tìm thấy tệp tĩnh.

Sẽ thật chu đáo nếu Django thốt ra một thông báo lỗi cho biết bạn không thể sử dụng http(s)://vớiDEBUG = True

Tôi đã phải thay đổi STATIC_URL thành '/ static /'

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.