2011-08-25 29 views
34

Tôi đang phát triển một dự án Django (1.3) được sáng tác bởi nhiều ứng dụng. Mỗi ứng dụng có các tệp tĩnh riêng trong thư mục static riêng của nó. Hơn nữa, tôi đã thêm một thư mục có tên là project_static nên chứa các tệp tĩnh phổ biến trong các ứng dụng khác nhau, chẳng hạn như jQuery.Quản lý các tệp tĩnh cho nhiều ứng dụng trong Django

Sự cố mà tôi gặp phải ngay lập tức là xung đột đặt tên. Theo mặc định, collectstatic sẽ chỉ đặt mọi thứ trong thư mục static toàn cầu mà không phân loại chúng theo ứng dụng. Điều này không hiệu quả đối với tôi, vì mỗi ứng dụng có - ví dụ - một tập tin có tên là css/screen.css.

Con đường tôi giải quyết nó là bằng cách loại bỏ django.contrib.staticfiles.finders.AppDirectoriesFinder từ STATICFILES_FINDERS và sử dụng namespaced static files dirs, vì vậy các thiết lập của tôi bây giờ trông giống như

STATICFILES_DIRS = (
    os.path.join(PROJECT_PATH, 'project_static'), 
    ('my_app', os.path.join(PROJECT_PATH, 'my_app', 'static')), 
    ('another_app', os.path.join(PROJECT_PATH, 'another_app', 'static')), 
    ... 
) 

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder', 
) 

Vấn đề là bằng cách này tôi đã làm mất các tập tin tĩnh cho tất cả các ứng dụng khác, ví dụ django.contrib.admin. Tất nhiên tôi có thể tự thêm admin, nhưng tôi không chắc chắn làm thế nào để làm điều này mà không vi phạm các admin, trong đó có một cấu trúc thư mục khác nhau.

Có cách nào tốt hơn để quản lý các tệp tĩnh với nhiều ứng dụng không?

Trả lời

39

Đây cũng là vấn đề tương tự xảy ra khi sử dụng thư mục templates dành riêng cho ứng dụng. Nếu bạn chỉ cần ném các tập tin trực tiếp dưới templates trong ứng dụng, bạn sẽ kết thúc với các vụ va chạm tên nếu hai ứng dụng hoặc thậm chí thư mục templates của dự án sử dụng các mẫu có cùng tên. Việc sửa chữa cho điều đó là để thực sự đưa các mẫu trong một thư mục tên của ứng dụng bên trong thư mục templates như:

- some_app 
    - templates 
     - some_app 
      - index.html 

Vì vậy, tôi áp dụng các ý tưởng tương tự để tĩnh:

- some_app 
    - static 
     - some_app 
      - css 
      - img 
      - js 

Bằng cách đó , khi bạn chạy collectstatic, mỗi tệp tĩnh của ứng dụng riêng lẻ sẽ được đặt bên trong thư mục không gian tên. Thay đổi duy nhất bạn cần thực hiện là đặt tiền tố cho từng tệp bằng thư mục tên ứng dụng trong các mẫu của bạn. Vì vậy, thay vì {{ STATIC_URL }}css/style.css bạn có {{ STATIC_URL }}my_app/css/style.css.

+0

nếu chúng tôi phân phát tệp tĩnh bằng nginx thì đây có phải là cách ưa thích không? (giữ các tệp tĩnh, các mẫu trong chính ứng dụng) – Dineshkumar

+0

Vâng. Bạn muốn tất cả các tài sản của bạn được quản lý với dự án của bạn. –

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