2012-06-27 21 views
9

Tôi có một câu hỏi chung về khung công tác tĩnh mới của Django 1.3.django staticfiles tại url root

Tôi thực sự thích chức năng tĩnh mới Django được giới thiệu trong Django 1.3. Thông thường, tôi đặt STATIC_URL = "/ static /" và nhập thẻ mẫu {{STATIC_URL}} vào mẫu của tôi. Thật tuyệt vời khi máy chủ phát triển tự động phục vụ các tệp tĩnh và tất cả nội dung của tôi được phân phối như mong đợi như thế nào.

The {{ STATIC_URL }} would be substituted in the template and might serve up files like this... 
example.com/static/css/master.css 
example.com/static/images/logo.png 
example.com/static/js/site.js 

Tuy nhiên, tôi đang làm việc với trang web kế thừa nơi phương tiện tĩnh được gắn ở gốc url. Ví dụ, đường dẫn đến các url tĩnh có thể trông như thế này:

example.com/css/master.css 
example.com/images/logo.png 
example.com/js/site.js 

Nó không sử dụng "tĩnh" namespace url. Tôi đã tự hỏi nếu có một cách để có được chức năng tĩnh mới không sử dụng không gian tên tĩnh và phục vụ các url ở trên, nhưng vẫn giữ lại các lợi ích của khung công tác tĩnh mới (tập tin tĩnh, thu thập được phục vụ bởi máy chủ phát triển, v.v.) Tôi đã thử đặt STATIC_URL = "" và STATIC_URL = "/", nhưng dường như không có hiệu quả mong muốn.

Có cách nào để định cấu hình các tệp tĩnh để phân phối tệp tĩnh mà không có vùng tên không? Cảm ơn bạn đã xem xét.

Trả lời

4

Bạn có thể tự thêm các địa điểm bổ sung mà không tồn tại trong static thư mục trong dự án của bạn:

urls.py

from django.conf import settings 
from django.conf.urls.static import static 

urlpatterns = patterns('', 
    # ... the rest of your URLconf goes here ... 
) 

if settings.DEBUG: 
    urlpatterns += static('/css/', document_root='app_root/path/to/css/') 
    urlpatterns += static('/images/', document_root='app_root/path/to/images/') 
    urlpatterns += static('/js/', document_root='app_root/path/to/js/') 

này sẽ lập bản đồ các phương tiện truyền thông cho máy chủ DEBUG dev. Và khi bạn đang chạy máy chủ chế độ sản xuất của bạn, bạn rõ ràng sẽ được xử lý các địa điểm tĩnh từ máy chủ web thay vì gửi yêu cầu thông qua để django.

+0

Cảm ơn jdi. Trong các mẫu, tôi vẫn còn {{STATIC_ROOT}} hoặc chỉ để nó là/css /,/images /,/js/....? –

+0

Nó sẽ không còn là một phần của ứng dụng tĩnh, vì nó không thể được thu thập thông qua "python manage.py collectstatic'. Bạn sẽ chỉ sử dụng các url đơn giản như thế: '/ css/foo.css'. Chúng đang được phân phối rõ ràng từ các vị trí riêng lẻ. Họ thậm chí có thể tồn tại bên ngoài không gian dự án django. – jdi

+0

document_root không nên bắt đầu bằng '/', bạn phải chỉ định thư mục gốc của dự án django của bạn, ví dụ: 'urlpatterns + = static ('/ css /', document_root = 'app_root/path/to/css /') ' –

2

lý do tại sao không giữ chức năng tĩnh và chỉ cần sử dụng ghi đè ở cấp máy chủ web để phân phối nội dung.

ví dụ:

rewrite /css /static permanent; (for nginx) 

này sẽ giữ cho thư mục dự án của bạn rất nhiều bụi và cũng làm cho nó dễ dàng hơn để di chuyển thư mục tĩnh của bạn xung quanh trong tương lai, ví dụ như chuyển sang STATIC_URL của bạn đến một CDN.

1

Đây là cách bạn thiết lập bạn urls.py để phục vụ cả các file tĩnh khác trên/trong Django 1.10 index.html và (trong khi vẫn có thể phục vụ quan điểm khác Django):

from django.contrib.staticfiles.views import serve 
from django.views.generic import RedirectView 

urlpatterns = [ 

    #/routes to index.html 
    url(r'^$', serve, 
     kwargs={'path': 'index.html'}), 

    # static files (*.css, *.js, *.jpg etc.) served on/
    url(r'^(?!/static/.*)(?P<path>.*\..*)$', 
     RedirectView.as_view(url='/static/%(path)s')), 
] 

Xem this answer nơi tôi đã viết giải thích đầy đủ hơn về cấu hình như vậy - đặc biệt nếu bạn muốn sử dụng nó để sản xuất.